Railsでのpluckとcollectの違いは何ですか?


123

2つのサンプルコードを次に示します。

最初のものcollect

User.first.gifts.collect(&:id)

2番目のものpluck

User.first.gifts.pluck(:id)

パフォーマンスなどに違いはありますか?

回答:


230

pluckdbレベルです。特定のフィールドのみを照会します。こちらをご覧ください

あなたがするとき:

 User.first.gifts.collect(&:id)

すべてのフィールドがロードされたオブジェクトがありid、Enumerableに基づくメソッドのおかげで単純に感謝します。

そう:

  • あなたがいる場合にのみ必要idのRails 4、使用してidsUser.first.gifts.ids

  • Rails 4で一部のフィールドのみが必要な場合は、次を使用しますpluckUser.first.gifts.pluck(:id, :name, ...)

  • Rails 3で1つのフィールドのみが必要な場合は、次を使用しますpluckUser.first.gifts.pluck(:id)

  • すべてのフィールドが必要な場合は、collect

  • Rails 4でいくつかのフィールドが必要な場合は、まだ使用してください pluck

  • Rails 3でいくつかのフィールドが必要な場合はselectcollect


「いくつかのフィールドが必要な場合は、selectand collectを使用pluckしてください」-のように、複数の属性で使用することはできませんpluck(:id, :name)か?
Alexander

@AlexPopov- Ryan Lefevreの回避策pluckを使用しない限り、Rails 4+は複数のフィールドのサポートをサポートしますが、Rails 3はサポートしません
マークジーマー2015年

3
Rails 4では、だけが必要な場合はid.ids参照ドキュメントを使用します。api.rubyonrails.org
Ivan Chau

30

はい。Railsガイドよると、オブジェクトを構築せずにpluck、データベースの結果をに直接変換します。これは、大規模または頻繁に実行されるクエリのパフォーマンスが向上することを意味します。arrayActiveRecord

@apneadivingの答えに加えてpluck、単一および複数の列名を引数として取ることができます。

Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]

3

基本的な主な違いは、Pluckはデータベースレベルで適用され、すべてのデータを収集してから、すべてのレコードが収集を使用する必要がある場合、およびいくつかのフィールドがPluckを使用する場合にレコードを返すことです。


2

取得したレコードの属性をほとんど使用していない場合。このような場合は、を使用する必要がありますpluck

User.collect(&:email)

上記の例で、メモリと時間を浪費しているよりもメール属性のみが必要な場合。データベースのユーザーテーブルからすべての列を取得するため、各属性(使用しない属性を含む)にメモリを割り当てます。

注:pluckユーザーのActiveRecord_Relationは返されません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.