我正在寻找一种更新给定模型的计数器缓存的漂亮方法。
这是我的模型:
class GameParticipation < ActiveRecord::Base
belongs_to :game, counter_cache: true
end
和 :
class Game < ActiveRecord::Base
has_many :game_participations
end
它不是像下面的代码那样对每个元素进行迭代更好的方法吗?
Game.pluck(:id).map{|g_id| Game.reset_counters(g_id, :game_participations) }
(我正在使用Rails4和activerecord)
最佳答案
要在一个请求中更新所有计数器缓存,我在http://ryan.mcgeary.org/2016/02/05/proper-counter-cache-migrations-in-rails/上找到了灵感
可以使用SQL在一个请求中完成:
ActiveRecord::Base.connection.execute <<-SQL.squish
UPDATE games
SET game_participations_count = (SELECT count(1)
FROM game_participations
WHERE game_participations.game_id = games.id)
SQL
由于所有更新都是在一个请求中完成的,因此执行所需的时间要少得多。
关于ruby-on-rails - 在模型的所有数据上重置计数器缓存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25792485/