5

私のモデルは次のとおりです。

class Campaign < ActiveRecord::Base
  has_many :days, dependent: :destroy
end

class Day < ActiveRecord::Base
  belongs_to :campaign

  has_many :time_slots
  before_destroy { time_slots.destroy_all }
end

class TimeSlot < ActiveRecord::Base
  belongs_to :day
  has_and_belongs_to_many :users
end

キャンペーンを削除して、関連するすべての日とタイムスロットを削除できるようにしたいと考えています。time_slot_users 結合テーブルのレコードも削除したいと思います。

を使用しようとしましdependent: :destroyたが、カスケードしていないようですか? before_destroyコールバックを使用する必要がありますか?

destroyとはどう違いdestroy_allますか?http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Delete+or+destroy%3Fを読みましたが、違いはまだあいまいです。

4

1 に答える 1

3

これが私がやった方法です:

class Campaign < ActiveRecord::Base
  has_many :days, dependent: :destroy
  has_many :members
  has_many :users, :through => :members
end

class Day < ActiveRecord::Base
  belongs_to :campaign
  has_many :time_slots, dependent: :destroy
end 

class TimeSlot < ActiveRecord::Base
  belongs_to :day
  has_and_belongs_to_many :users

  before_destroy do |time_slot|
      users.delete
  end
end

has_many リレーションには、dependent: :destroy を使用します。これにより、関連付けられたキャンペーン、日、およびタイムスロットの各インスタンスで destroy が呼び出されます。ユーザーとタイムスロットの間の関連付けを削除するために、time_slot_users テーブルのレコードにbefore_destroyコールバックを追加しました。deleteこれらの行は、オブジェクト インスタンスを作成せずに削除できるため、使用しました。結合テーブルの場合、とにかくモデル オブジェクトを使用する可能性は低いため、これが唯一の方法です。

役立つリソース:

于 2013-04-30T18:27:33.353 に答える