我有2个模特
class Deal < ActiveRecord::Base
has_many :couponizations, dependent: :destroy
has_many :coupon_codes, through: :couponizations, source: :coupon_code, dependent: :destroy
accepts_nested_attributes_for :coupon_codes, allow_destroy: true
end
和
class CouponCode < ActiveRecord::Base
has_one :couponization, dependent: :destroy
has_one :deal, through: :couponization, source: :deal
由多对多关系链接
class Couponization < ActiveRecord::Base
belongs_to :coupon_code
belongs_to :deal
end
尽管我指定了dependent: :destroy
选项,但当我删除优惠时,优惠券代码不会被删除。但是,优惠券会成功删除。有没有办法删除对象销毁时的关联嵌套记录?
答案 0 :(得分:19)
使用dependent: :destroy
时会忽略选项:through
(请参阅doc)。您必须手动执行此操作,例如before_destroy
callback。
class Deal
before_destroy :destroy_coupon_codes
private
def destroy_coupon_codes
self.coupon_codes.destroy_all
end
end
答案 1 :(得分:4)
我建议使用:after_destroy
回调功能,因此如果因某种原因导致部分Deal
实例失败,则您最终无法删除所有CouponCodes
。
这是一个应该有效的:after_destroy
示例:
after_destroy { |record|
CouponCode.destroy(record.coupon_codes.pluck(:id))
}
确保从dependent: :destroy
模型中的has_many :couponizations
移除Deals
,因为所有couponizations
现在都会被has_one :couponization, dependent: :destroy
中的CouponCode
销毁模型。