我正在寻找一种更新给定模型的计数器缓存的漂亮方法.
这是我的模型:
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
由于所有更新都在一个请求中完成,因此执行所需的时间要少得多.