サービスリリース後に 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

- 作者: Paolo Perrotta,角征典
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2010/08/28
- メディア: 大型本
- 購入: 18人 クリック: 533回
- この商品を含むブログ (125件) を見る