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,则可能会有所不同。