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