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

(了)