has_many的问题:通过,缓存,触摸和counter_cache
我有很多has_many:通过我的应用程序中的关系。 我是扩展显示与此相关的信息,例如连接对象的数量。 每当用户更新关系时,联接表都会被修改,我可以抓住这个我的Sweepers。
问题是,连接表条目被删除 ,而不是被销毁 。 如果关系消失了,我没有合理的方法来检测这个,我正在缓存中显示误导性的信息。 一切如:touch => true,或:counter_cache => true partially。 如果更新或创建关系,它会增加。 但是,如果用户删除关系,则没有任 :counter_cache正在崩溃,:触摸不会触发。
垃圾解决方案是在保存主模型时在控制器中调用.touch。 这种作品,但似乎真的非专业。 这应该在模型逻辑中,而不是在控制器中。
我觉得我错过了一些大事,但是我无法理解这一点。 有人可以对这个问题有所了解吗?
猴子修补Active Record不是必需的。 定义关联时,将:dependent
选项设置为:destroy
。
class Book < ActiveRecord::Base has_many :authorships, :dependent => :destroy has_many :authors, :through => :authorships, :dependent => :destroy end
检查Mark S.编写的猴子补丁来回答他自己的问题: 如何在每个表的Rails中创建一个完整的审核日志?
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,则可能会有所不同。