1. ホーム
  2. ruby-on-rails

Railsで、find_eachとwhereの違いは何ですか?

2023-10-08 09:03:41

質問

Railsでは find_each ここで は、ActiveRecordがサポートするDatabaseからデータを取得するために使用されます。

クエリの条件を where のようにします。

c = Category.where(:name => 'Ruby', :position => 1)

また、バッチサイズを find_each のようにします。

Hedgehog.find_each(batch_size: 50).map{ |p| p.to_json }

しかし、次の2つのコードの違いは何でしょうか?

# code 1
Person.where("age > 21").find_each(batch_size: 50) do |person|
  # processing
end

# code 2
Person.where("age > 21").each do |person|
  # processing
end

コード1は毎回50個のタプルを一括で取得し、コード2は一度にすべてのタプルを取得するのでしょうか?詳細な説明をお願いします。

私の意見は

  1. 両方とも wherefind_each は一括取得に使用できますが find_each .
  2. find_each はクエリ条件を渡すことをサポートしていません。

私の理解が誤っている場合は、訂正してください。

どのように解決するのですか?

アクティブなレコードリレーションは、自動的にすべてのレコードをメモリにロードしません。

を呼び出したとき #each を呼び出すと、すべてのレコードがメモリに読み込まれます。また #find_each を呼び出すと、レコードは指定されたバッチサイズのバッチでメモリにロードされます。

ですから、クエリが返すレコードの数がサーバの利用可能なリソースに対して過剰なメモリ量になる場合は #find_each を使うのは素晴らしい選択でしょう。

基本的にはrubyのlazy enumerationを使うようなものです。 #to_enum#lazy#each_slice で、次に #each (とする(非常に便利)。