ActiveRecord のキャッシュをオフにする
あるテーブルのすべてのフラグを false にしたい時に、件数が多くなる事が予想されたので1000件ずつ処理しようと考え、次のようなコードを書きました。
while Hoge.where("flag IS true").count > 0 sql = "UPDATE hoge SET flag = false WHERE flag IS true LIMIT 1000" Hoge.connection.execute(sql) end
一見正しく動作しそうなのですが、このまま動かすと見事に無限ループになります。ログを確認すると次のような気になる箇所を発見。
CACHE (0.0ms) SELECT COUNT(*) FROM `hoge` WHERE (flag IS true)
どうやら、最初の count で計算したレコード数をキャッシュして延々同じ比較を行ってしまっている様子。このようなケースでは明示的にキャッシュをオフにしてあげましょう。
Hoge.uncached do while Hoge.where("flag IS true").count > 0 sql = "UPDATE hoge SET flag = false WHERE flag IS true LIMIT 1000" Hoge.connection.execute(sql) end end