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

ich*_*kov 12 activerecord ruby-on-rails ruby-on-rails-3 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
Run Code Online (Sandbox Code Playgroud)

class CouponCode < ActiveRecord::Base
   has_one :couponization, dependent: :destroy
   has_one :deal, through: :couponization, source: :deal
Run Code Online (Sandbox Code Playgroud)

这是由多对多关系联系在一起的

class Couponization < ActiveRecord::Base
   belongs_to :coupon_code
   belongs_to :deal
end
Run Code Online (Sandbox Code Playgroud)

尽管我指定了dependent: :destroy选项,但当我删除交易时,优惠券代码不会被删除.但是,优惠券会成功删除.有没有办法删除对象销毁的关联嵌套记录?

Bal*_*ick 22

dependent: :destroy使用时:through请忽略这些选项(参见doc).你必须手动完成,例如before_destroy 回调.

 class Deal

   before_destroy :destroy_coupon_codes

   private

   def destroy_coupon_codes
     self.coupon_codes.destroy_all   
   end
 end
Run Code Online (Sandbox Code Playgroud)

  • 做这个原子。这意味着如果删除失败,删除子项将再次恢复。谢谢。 (2认同)

Sbb*_*bbs 7

我建议使用:after_destroy回调,所以如果销毁某个Deal实例由于任何原因失败,你最终不会删除它的所有CouponCodes.

这是一个:after_destroy应该有效的示例:

after_destroy { |record|
  CouponCode.destroy(record.coupon_codes.pluck(:id))
}
Run Code Online (Sandbox Code Playgroud)

确保删除dependent: :destroyhas_many :couponizationsDeals模型中,因为所有couponizations现在将被破坏has_one :couponization, dependent: :destroyCouponCode模型。