我正在寻找一种更新给定模型的计数器缓存的漂亮方法。

这是我的模型:

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/

10-13 04:53