用于范围的计数器缓存

时间:2014-07-08 13:47:30

标签: ruby-on-rails ruby-on-rails-4 counter-cache

我之前在我的应用中设置了一些counter_caches,但仅限于简单的belongs_to关系。

我做了很多像

这样的查询
user.collections.got.count

其中got是我的收藏模型中的范围

belongs_to :user
scope :got, -> { where(status: 'Got') }

我可以设置一个counter_cache来计算标记为"得到"?的user.collections的数量。 我看到的问题是counter_cache只更新为create或destroy但不更新动作。有一个很好的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以将After_save回调添加到Collection类,并自行执行计数器缓存操作。

class Collection < ActiveRecord::Base
  belongs_to :user

  after_save :update_got_counter

  def update_got_counter
    if changed_attributes.has_key?('status')
      # do the cache manipulation here
      User.increment_counter(:collections_get_count, user.id)
      or
      User.decrement_counter(:collections_get_count, user.id)
    end
  end
end