Rails:具有自定义查询关联的counter_cache

时间:2015-02-03 16:25:31

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord database-performance

我有一个这样的模型:

class Vote
  belongs_to :content, counter_cache: true
end

class Content
  has_many :votes
  has_many :votes_up, -> { where(positive: true) }, class_name: 'Vote'
  has_many :votes_down, -> { where(positive: false) }, class_name: 'Vote'
end

如果我创建了正确的迁移,当我执行mycontent.votes_count时,它将不会进行查询。

但是mycontent.votes_up.countmycontent.votes_down.count呢?我可以用同样的(简单的)方式缓存它们吗?

1 个答案:

答案 0 :(得分:1)

我不知道开箱即用的解决方案,所以我认为它需要一些自定义代码。它应该非常简单,只需要向Vote和两个缓存列添加一些回调到Content。您可以在此处查看可用的回调:http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

我认为向after_save添加after_destroyVote可以解决问题。

你也可以看看这个宝石:https://github.com/magnusvk/counter_culture它可能会有所帮助。

但基本上你可以添加一些回调到Vote并自己增加/减少两个自定义计数器。