删除对象销毁Rails上的关联记录

时间:2014-01-04 19:12:30

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-4

我有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选项,但当我删除优惠时,优惠券代码不会被删除。但是,优惠券会成功删除。有没有办法删除对象销毁时的关联嵌套记录?

2 个答案:

答案 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销毁模型。