人生シーケンスブレイク

人生を楽してクリアしたい。当面はPython学習帳

Railsで、後からcounter_cacheを追加した時にcounter_cacheの初期値を入れたい

サービスリリース後に counter_cache を追加したので、既存レコードのcounter_cacheをリセットしたくなった。

やり方

reset_counters メソッドを利用するとカウンターリセットできる。

Room.reset_counters(id, :column)

子要素の要素数に合わせて修正してくれるので、数値ズレが出てしまった際にも利用可能。

reset_counters (ActiveRecord::Base) - APIdock

適用

Railsコンソール上で、以下のように叩くと全レコードのカウンターをリセットできる。

Room.all.each {|i| Room.reset_counters(i.id, :messages_count)}

レコード数がそれなりにある場合には、 find_each を使う方が良い。

Room.find_each {|i| Room.reset_counters(i.id, :messages_count)}

# バッチサイズを変更したい場合
Room.find_each(batch_size: 100) {|i| Room.reset_counters(i.id, :messages_count)}

migration file にそのまま書いてしまう場合はこう

class AddMessagesCountToRoom < ActiveRecord::Migration
  def up
    add_column :rooms, :messages_count, :integer, default: 0
    Room.find_each {|i| Room.reset_counters(i.id, :messages_count)}
  end
 
  def down
    remove_column :rooms, :messages_count, :integer
  end
end

メタプログラミングRuby

メタプログラミングRuby