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。这将导致在活动、日期和时间段的每个关联实例上调用销毁。为了删除用户和时间段之间的关联,time_slot_users 表中的记录,我添加了before_destroy回调。我使用delete这些行是因为可以在不创建对象实例的情况下删除这些行。对于连接表,无论如何您都不太可能拥有模型对象,因此这是唯一的方法。

有用的资源:

于 2013-04-30T18:27:33.353 回答