Rails 3:公開されている場合にのみ、counter_cacheを更新します
-
27-10-2019 - |
質問
これは難しい質問です。
記事、レビューなど、複数のコンテンツタイプを備えたプロジェクトがあります。各コンテンツタイプにはコメントがあり、コメントはあらゆるコンテンツタイプに属する可能性があるため、ポリ型です。
すべてのコンテンツページに合計コメントカウンターを配置して、コメントの数を示し、これを行うためにカウンターキャッシュを実装しました。 ( @article.comments.countのようなものはより多くのクエリであり、スレッドコメントのために祖先の宝石を使用しているので、子のコメントはその数でカウントされず、ルートのコメントだけです。)
カウンターキャッシュはうまく機能し、正確な数のコメントを表示しますが、いつものように少しキャッチがあります。コメントは常にすぐに公開されるわけではなく、登録されたユーザーのみがすぐに公開でき、これらのコメントには「2」のステータスがあります。未登録のユーザーは、モデレートキューに入れられます。これらのコメントには、「1」のステータスがあります。
問題は、カウンターキャッシュがすべて同じカウントされるため、適度に4つのコメントがあり、1つの承認されたコメントがある場合、合計カウントは5です。
COMMENT.STATUSが「2」ではない場合にインクリメントしないように指示するために、カウンターキャッシュに例外を追加する方法はありますか?同様に、コメントリソースのバックエンドで、そのコメントを公開するためのコメント(ITステータスを2のステータス)に設定すると、関連する多型 /コンテンツタイプの増分のカウンターキャッシュを作成する方法(モデル、コントローラーなど)がありますか?
comments.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
解決
私が現時点で考えることができるのは、モデルに独自のカウンターキャッシュ列を提供し、必要に応じて増分/減少を提供する必要があるかもしれません。すなわち
active_comments_count
pending_comments_count
その後、モデルでは、トリガーできます update_comment_count aを介した方法 折り返し電話.
それはあなたの側でのより多くの努力ですが、私はこのアプローチがうまくいくと確信しています。