ruby-on-rails - rails 3 : Update counter_cache only if published

标签 ruby-on-rails ruby counter-cache

这是一个棘手的问题。

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

我想在我的所有内容页面上放置一个评论总数计数器以显示有多少评论,并且我实现了一个计数器缓存来执行此操作。 (@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/

相关文章:

mysql - 当我运行 rake db :seed, 时,我不断收到 "rake aborted! ActionView::Template::Error: Missing host to link to! "

ruby-on-rails - 如何为现有的 Ruby on Rails 5 应用程序创建 REST API?

javascript - 在 travis 上测试失败,但通过了本地测试

Ruby - Nokogiri - 需要将 node.value 放入数组

ruby - 使用column_names时有没有办法减少counter_culture gem?

ruby-on-rails - Ruby on Rails Bootstrap Glyphicons 不工作

ruby-on-rails - 使用 Procfile 开始在 Heroku 上使用 Rails

ruby - 通过 Linux tap 设备的 TCP 隧道

ruby-on-rails - 如果我尝试制作计数器缓存,为什么会出现此错误?

ruby-on-rails - Ruby on Rails -- 计数器缓存事务安全吗?