这是一个棘手的问题。
我有一个包含多种内容类型的项目,例如文章、评论等。每种内容类型都有评论,评论是多态的,因为它们可以属于任何内容类型。
我想在我的所有内容页面上放置一个评论总数计数器以显示有多少评论,并且我实现了一个计数器缓存来执行此操作。 (@article.comments.count 之类的查询更多,并且由于我将 Ancestry gem 用于线程评论,因此子评论不计入该数字,仅计入根评论。)
计数器缓存运行良好并显示评论的准确数量,但一如既往地有一个小问题。评论并不总是立即发布,只有注册用户才能立即发布,并且这些评论的 :status 为“2”。未注册用户进入审核队列;这些评论的 :status 为“1”。
问题是,计数器缓存对它们的计数都是一样的,所以如果您有 4 条处于审核状态的评论和 1 条已批准的评论,则总数为 5。
如果 comment.status 不是“2”,有没有办法在计数器缓存中添加一个异常来告诉它不要递增?同样,当在评论资源的后端并将该评论设置为发布(将其状态设为 2)时,是否有办法(模型、 Controller 或其他方式)为其关联的多态/内容类型增量创建计数器缓存?
评论.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
最佳答案
目前我能想到的是,您可能需要在模型中提供自己的计数器缓存列,并根据需要进行递增/递减。即
active_comments_count
pending_comments_count
然后在您的模型中,您可以通过 callback 触发您的 update_comment_count 方法.
它更多的是你这边的努力,但我相信这种方法会奏效。
关于ruby-on-rails - rails 3 : Update counter_cache only if published,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5852915/