6

これは難しい質問です。

記事、レビューなど、複数のコンテンツタイプを持つプロジェクトがあります。各コンテンツタイプにはコメントがあり、コメントは任意のコンテンツタイプに属することができるため、多形です。

すべてのコンテンツページに合計コメントカウンターを配置して、コメントの数を表示したいと思います。これを行うために、カウンターキャッシュを実装しました。(@ 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 
4

1 に答える 1

5

現時点で私が考えることができるのは、モデルに独自のカウンターキャッシュ列を提供し、必要に応じてインクリメント/デクリメントする必要があるかもしれないということです。すなわち

active_comments_count
pending_comments_count

次に、モデルで、コールバックを介してupdate_comment_countメソッドをトリガーできます。

それはあなたの側のより多くの努力ですが、私はこのアプローチがうまくいくと確信しています。

于 2011-05-02T05:00:42.487 に答える