我有很多has_many:通过我的应用程序中的关系。我是扩展显示与此相关的信息,例如连接对象的数量。每当用户更新关系时,连接表都会被修改,我可以抓住这个我的扫描者。
问题是,联接表条目是已删除,而不是已销毁。如果关系消失了,我没有合理的方法来检测这个,我在缓存中显示误导性的信息。一切如:touch => true,或:counter_cache =>真正起作用。如果更新或创建关系,它会增加。但如果用户删除关系,则不会发生任:counter_cache正在崩溃,:触摸不会触发。
垃圾解决方案是在保存主模型时在控制器中调用.touch。这种作品,但似乎真的非专业。这应该在模型逻辑中,而不是在控制器中。
我觉得我错过了一些大事,但是我无法理解这一点。任何人都可以对这个问题有所了解吗?
答案 0 :(得分:1)
猴子修补Active Record不是必需的。定义关联时,请将:dependent
选项设置为:destroy
。
class Book < ActiveRecord::Base
has_many :authorships, :dependent => :destroy
has_many :authors, :through => :authorships, :dependent => :destroy
end
答案 1 :(得分:0)
检查Mark S.写的猴子补丁回答他自己的问题:How to create a full Audit log in Rails for every table?
ActiveRecord::Associations::HasManyThroughAssociation.class_eval do
def delete_records(records)
klass = @reflection.through_reflection.klass
records.each do |associate|
klass.destroy_all(construct_join_attributes(associate))
end
end
end
它也可能对您的问题有用。请注意,这是在Rails 2中。如果您已经使用Rails 3,则可能会有所不同。