4

以前にアプリでいくつかの counter_caches を設定しましたが、単純な belongs_to 関係のみを対象としています。

私は次のような多くのクエリを実行しています

user.collections.got.count

got はコレクション モデルのスコープです

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

「取得済み」とマークされた user.collections の数をカウントするように counter_cache を設定できますか? 私が見る問題は、counter_cache が create または destroy でのみ更新され、更新アクションでは更新されないことです。これには良い方法がありますか?

4

1 に答える 1

2

you can add a after_save callback to the Collection class and do the counter cache manipulation by yourself.

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
于 2014-07-08T14:27:53.577 に答える