今まであまりよく考えずにfindやeachメソッドを使ってきましたが、find_eachの存在を知り、調べてみました。
結論としては、大量のデータを取得するときにfindやeachだとメモリを圧迫するので、メモリを節約しながら大量のデータを取得する場合にはfind_eachを使った方が良いようです。
find_eachメソッドは、大量のレコードに対してループ処理を実行したい場合にメモリ不足を防ぐことが出来るメソッド
find_each
大量のレコードを扱う場合に使用することができます。例えば、1万件以上のレコードがある場合に、allやeachを使うとメモリを圧迫してしまうことがありますが、find_eachを使うと一定数ずつレコードを取得しながら処理を行うことができます。
以下は、usersテーブルからidが1以上のユーザーを全て取得し、それぞれのnameを出力する例です。
User.where("id >= 1").find_each do |user|
puts user.name
end
この例では、idが1以上のユーザーが膨大にいる場合でも、find_eachを使うことで、一度に取得するレコード数を制限しているため、メモリを圧迫することなく処理を行うことができます。
じゃあ基本的にはfindeachを使うべき?
find_eachは膨大なレコードを処理する場合にメモリの使用量を抑えられるため、非常に有用です。
しかし、1つのレコードだけを取得する場合や、少数のレコードしか取得しない場合は、findの方がより簡潔かつ直感的です。つまり、データベースから取得するレコードの数によって、使い分けるべきです。