6

这是一个棘手的问题。

我有一个具有多种内容类型的项目,例如文章、评论等。每种内容类型都有评论,评论是多态的,因为它们可以属于任何内容类型。

我想在我的所有内容页面上放置一个总评论计数器以显示有多少评论,我实现了一个计数器缓存来做到这一点。(@article.comments.count 之类的查询更多,并且当我使用 Ancestry gem 进行线程评论时,子评论不计入该数量,仅计入根评论。)

计数器缓存效果很好,并显示了准确的评论数量,但与往常一样,有一个小问题。评论并不总是立即发布,只有注册用户才能立即发布,并且这些评论的 :status 为“2”。未注册用户进入审核队列;这些评论的状态为“1”。

问题是,计数器缓存对它们的计数都是一样的,因此,如果您有 4 条审核评论和 1 条已批准评论,则总数为 5。

如果comment.status不是'2',有没有办法在计数器缓存上添加一个异常来告诉它不要增加?同样,当在评论资源的后端并设置要发布的评论(将其状态设为 2)时,是否有办法(模型、控制器或其他)使其关联的多态/内容类型增加计数器缓存?

评论.rb

 # Comments
 has_many :comments, :as => :commentable, :dependent => :destroy
 accepts_nested_attributes_for :comments

文章.rb

belongs_to :commentable, :polymorphic => TRUE, :touch => TRUE, :counter_cache => TRUE 
4

1 回答 1

5

目前我能想到的是,您可能必须在模型中提供自己的计数器缓存列,并根据需要进行递增/递减。IE

active_comments_count
pending_comments_count

然后在您的模型中,您可以通过回调触发update_comment_count方法。

它更多的是你的努力,但我相信这种方法会奏效。

于 2011-05-02T05:00:42.487 回答