在进行收集时更新计数器缓存<<(object,...)

时间:2011-12-07 14:02:21

标签: ruby-on-rails activerecord

嗨我在rails中使用简单的计数器缓存时遇到了问题。我有以下型号:

class CarImage < ActiveRecord::Base
  belongs_to :car, :counter_cache => :images_count
end

class Car < ActiveRecord::Base
  has_many :images, :class_name => "CarImage", :dependent => :destroy, :limit => 4
end

执行此操作时会出现问题:

car1.images << car2.images

两辆车上的images_count都没有相应更新。

我在主题上找到了这个:How to update counter_cache when updating a model? 我的情况解决方案看起来像这样:

class Car < ActiveRecord::Base
  has_many :images, :class_name => "CarImage", :dependent => :destroy, :limit => 4
  after_save :update_counter, :if => :car_id_changed?

  private

  def update_counter
    new_car = Car.find(car_id)
    Car.increment_counter(:images_count, new_car.id)
    if car_id_was.present?
      old_car = Car.find(car_id_was)
      Car.decrement_counter(:images_count, old_car.id)
    end
  end

end

但是 - 我问自己 - 为什么这不是第一手的铁轨?我在文档中找不到关于这个问题的任何内容,对我来说,使用rails中的内置counter_cache几乎无法使用,如果真的如此,它只支持创建和销毁 - 不更新!任何人都可以给出一个很好的解释,为什么这是?我真的有必要建立一个回调并密切关注我自己的关系吗?

顺便说一句。我正在使用3.1

0 个答案:

没有答案