大量のレコードを取得してループ処理する場合は、eachではなくfind_eachメソッドを使う
July 28, 2021
こんにちは、たわらです。
さて、大量のレコードを取り出して、ループで処理するときってありますよね。 たとえば新機能をリリースするために、ある既存のテーブルのいくつかのフラグが 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 件ずつ分割して取得します。便利ですね!
参考
[http://cloudcafe.tech/?p=2446:title]
[https://railsdoc.com/page/find_each:title]
(了)