Rails模型中销毁关联对象的方法,哪种语法正确?
结论:写法二完全正确,写法一存在语法错误
写法一的错误原因
在Ruby语法里,:order_payment_detail是符号(Symbol)类型,并非你要操作的关联对象:
:order_payment_detail.present?这行是判断符号本身是否存在,而符号永远会返回true,这行逻辑完全无效;- 更关键的是,符号本身没有
destroy方法,执行:order_payment_detail.destroy会直接抛出NoMethodError,根本无法触发关联对象的销毁操作。
写法二的正确性
order_payment_detail是Rails根据你定义的has_one :order_payment_detail自动生成的实例方法,调用它会返回当前模型关联的OrderPaymentDetail对象(如果存在)。之后调用destroy方法,才能真正销毁这个关联对象。
额外优化建议
其实你完全可以不用写这个before_destroy回调,直接在has_one关联里配置dependent: :destroy即可实现自动销毁:
has_one :order_payment_detail, inverse_of: :payment_order, dependent: :destroy accepts_nested_attributes_for :order_payment_detail, allow_destroy: true
这样当主对象被销毁时,Rails会自动销毁关联的order_payment_detail对象,代码更简洁规范。
内容的提问来源于stack exchange,提问作者João Gabriel
相关产品推荐
相关产品推荐

