我的模特是:
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,差异仍然很模糊。
答案 0 :(得分: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
因为可以在不创建对象实例的情况下删除这些行。对于连接表,你不太可能有一个模型对象,所以这是唯一的方法。
有用的资源: