tawara's blog

雑記。個人の見解です。

大量のレコードを取得してループ処理する場合は、eachではなくfind_eachメソッドを使う

こんにちは、たわらです。

さて、大量のレコードを取り出して、ループで処理するときってありますよね。 たとえば新機能をリリースするために、ある既存のテーブルのいくつかのフラグがtrueであれば、新しく追加したカラムにtrueを入れるときとか。

そんなときeachを使ってこんなふうに書く方法はすぐに思いつきます。

ManyHoge.each do |mh|
  mh.new_column = true if mh.old_column_1 == true && mh.old_column_2 == true
end

ただ既存レコードが大量にある場合があります。8万件とか。その場合、eachだとすべてのレコードを一気に取得して、メモリに保存してしまいます。メモリが足りないとフリーズしてしまいます。

そこで、一気にレコードを取得するのではなく分割して取得・処理する方法を利用します。find_eachメソッドです。

ManyHoge.find_each do |mh|
  mh.new_column = true if mh.old_column_1 == true && mh.old_column_2 == true
end

デフォルトで1,000件ずつ分割して取得します。便利ですね!

参考

Rails のループ処理(each, find_each, find_in_batches) – Cloud Cafe

find_each | Railsドキュメント

(了)