这是一个棘手的问题。
我有一个包含多种内容类型的项目,例如文章,评论等。每种内容类型都有注释,注释是多态的,因为它们可以属于任何内容类型。
我想在我的所有内容页面上放置一个总评论计数器,以显示有多少评论,并且我实现了一个计数器缓存来执行此操作。 (像@ 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
答案 0 :(得分:5)
目前我能想到的是,您可能需要在模型中提供自己的计数器缓存列,并根据需要递增/递减。即。
active_comments_count
pending_comments_count
然后在您的模型中,您可以通过callback触发 update_comment_count 方法。
更多的努力在你身边,但我相信这种方法会奏效。