大量のレコードを取得してループ処理する場合は、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
(了)