Rails 3:仅在发布时更新counter_cache

时间:2011-05-02 02:08:27

标签: ruby-on-rails ruby counter-cache

这是一个棘手的问题。

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

我想在我的所有内容页面上放置一个总评论计数器,以显示有多少评论,并且我实现了一个计数器缓存来执行此操作。 (像@ article.comments.count这样的东西是更多的查询,因为我使用Ancestry gem进行线程注释,所以子注释不计入该数字,只计算根数。)

计数器缓存效果很好,并显示准确的评论数量,但一如既往只有一点点。评论并不总是立即发布,只有注册用户可以立即发布,并且这些评论的状态为“2”。未注册的用户进入审核队列;这些评论的状态为'1'。

问题是,计数器缓存对它们进行了相同的计算,因此,如果您有适度的四条评论和一条已批准的评论,则总计数为5.

有没有办法在计数器缓存中添加一个异常,告诉它如果comment.status不是'2'则不增加?同样,当在评论资源的后端并设置要发布的注释(给它状态为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 

1 个答案:

答案 0 :(得分:5)

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

active_comments_count
pending_comments_count

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

更多的努力在你身边,但我相信这种方法会奏效。