加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 重置模型的所有数据上的计数器缓存

发布时间:2020-12-16 21:43:38 所属栏目:百科 来源:网络整理
导读:我正在寻找一种更新给定模型的计数器缓存的漂亮方法. 这是我的模型: class GameParticipation ActiveRecord::Base belongs_to :game,counter_cache: trueend 而且: class Game ActiveRecord::Base has_many :game_participationsend 这不是比像下面的代码
我正在寻找一种更新给定模型的计数器缓存的漂亮方法.

这是我的模型:

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

由于所有更新都在一个请求中完成,因此执行所需的时间要少得多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读