web-dev-qa-db-ja.com

オブジェクトdestroyの関連レコードを削除するRails

私は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オプションを指定しましたが、取引を削除してもクーポンコードが削除されません。ただし、クーポン化は正常に削除されます。オブジェクト破棄で関連付けられたネストされたレコードを削除する方法はありますか?

12
icherevkov

オプションdependent: :destroyは、:throughとともに使用する場合は無視されます( doc を参照)。手動で行う必要があります。たとえば、before_destroycallback です。

 class Deal

   before_destroy :destroy_coupon_codes

   private

   def destroy_coupon_codes
     self.coupon_codes.destroy_all   
   end
 end
20
Baldrick

:after_destroyコールバックを使用することをお勧めします。そのため、何らかの理由でDealインスタンスの破棄が失敗した場合、そのCouponCodesをすべて削除することにはなりません。

動作するはずの:after_destroyの例を次に示します。

after_destroy { |record|
  CouponCode.destroy(record.coupon_codes.pluck(:id))
}

すべてのDealscouponizationsモデルのdependent: :destroyによって破棄されるため、CouponCodeモデルのhas_many :couponizationsからhas_one :couponization, dependent: :destroyを必ず削除してください。

4
Sbbs