これは難しい質問です。
記事、レビューなど、複数のコンテンツタイプを持つプロジェクトがあります。各コンテンツタイプにはコメントがあり、コメントは任意のコンテンツタイプに属することができるため、多形です。
すべてのコンテンツページに合計コメントカウンターを配置して、コメントの数を表示したいと思います。これを行うために、カウンターキャッシュを実装しました。(@ article.comments.countのようなものはより多くのクエリであり、スレッド化されたコメントにAncestry gemを使用しているため、子コメントはその数にカウントされず、ルートコメントのみがカウントされます。)
カウンターキャッシュはうまく機能し、コメントの正確な数を示しますが、いつものように1つの小さな落とし穴があります。コメントは常にすぐに公開されるわけではなく、登録済みのユーザーのみがすぐに公開できます。これらのコメントの:statusは「2」です。未登録のユーザーはモデレートキューに入れられます。これらのコメントの:statusは「1」です。
問題は、カウンターキャッシュがそれらをすべて同じようにカウントすることです。したがって、モデレート中の4つのコメントと1つの承認されたコメントがある場合、合計カウントは5になります。
comment.statusが「2」でない場合にインクリメントしないようにカウンターキャッシュに例外を追加する方法はありますか?同様に、コメントリソースのバックエンドにあり、そのコメントを公開するように設定している場合(ステータスを2に設定)、関連するポリモーフィック/コンテンツタイプの増分のカウンターキャッシュを作成する方法(モデル、コントローラーなど)はありますか?
コメント.rb
# Comments
has_many :comments, :as => :commentable, :dependent => :destroy
accepts_nested_attributes_for :comments
article.rb
belongs_to :commentable, :polymorphic => TRUE, :touch => TRUE, :counter_cache => TRUE