web-dev-qa-db-ja.com

Rails 4:すべてのレコードを検索

ActiveRecord :: Relation#allはRails 4で非推奨になったため、すべてのレコードをどのように反復するのですか?

以前は次のようになりました。

Foo.all.each do |foo|
  # whatever
end

私は今のように近似することができますが、それは汚い感じがします:

Foo.where(true).each do |foo|
  # whatever
end

もっと良い方法はありますか?

47
jemminger

Active Record Query InterfaceのRailsガイド によると、すべてのレコードを反復処理する正しい方法は find_each を使用することです。

Foo.all.eachを使用すると、entireテーブルがメモリにロードされ、すべての行がインスタンス化されます。その後、インスタンスを反復処理します。 find_eachはバッチでこれを行います。これはメモリ使用量の点でより効率的です。

ガイドから:

find_eachメソッドはレコードのバッチを取得し、モデルとして個別にブロックにeachレコードを生成します。次の例では、find_eachは1000レコード(find_eachfind_in_batchesの両方の現在のデフォルト)を取得し、モデルとしてブロックに各レコードを個別に生成します。このプロセスは、すべてのレコードが処理されるまで繰り返されます。

User.find_each do |user|
  NewsLetter.weekly_deliver(user)
end

参照:

64
user2062950

はい、_Foo.all_。

allは、ActiveRecord :: Baseではなく、ActiveRecord :: Relation(例:Foo.where(true))では非推奨です。

http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-all

12
sevenseacat

Rails 4:のリリースノート

Model.allは、レコードの配列ではなくActiveRecord :: Relationを返すようになりました。本当に配列が必要な場合は、Relation#to_aを使用します。

したがって、コードは次のようになります。

Foo.all.to_a.each do |foo|
  # whatever
end

http://guides.rubyonrails.org/4_0_release_notes.html#active-record を参照してください

11
user3356885

これは、Railsのどこかで誤った非推奨の警告のようです。 Rails 4.0.2の時点で、警告メッセージはまだ存在しています。Foo.allを実行しようとすると、次のエラーが表示されます。

非推奨の警告:Relation#allは非推奨です。リレーションを積極的にロードする場合は、#loadを呼び出すことができます(例:Post.where(published: true).load)。リレーションからレコードの配列を取得する場合は、#to_aを呼び出すことができます(例:Post.where(published: true).to_a)。

RailsCastsで#allが変更されて、Rails 4(配列の代わりに))が返されることをほぼ100%確信しています-非推奨の言及はありません。

0