has_many的问题:通过,缓存,触摸和counter_cache

时间:2010-08-20 14:25:17

标签: ruby-on-rails ruby activerecord has-many-through

我有很多has_many:通过我的应用程序中的关系。我是扩展显示与此相关的信息,例如连接对象的数量。每当用户更新关系时,连接表都会被修改,我可以抓住这个我的扫描者。

问题是,联接表条目是已删除,而不是已销毁。如果关系消失了,我没有合理的方法来检测这个,我在缓存中显示误导性的信息。一切如:touch => true,或:counter_cache =>真正起作用。如果更新或创建关系,它会增加。但如果用户删除关系,则不会发生任:counter_cache正在崩溃,:触摸不会触发。

垃圾解决方案是在保存主模型时在控制器中调用.touch。这种作品,但似乎真的非专业。这应该在模型逻辑中,而不是在控制器中。

我觉得我错过了一些大事,但是我无法理解这一点。任何人都可以对这个问题有所了解吗?

2 个答案:

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