web-dev-qa-db-ja.com

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

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

最初のcollect

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

2番目のpluckの場合:

User.first.gifts.pluck(:id)

パフォーマンスと他の何かに違いはありますか?

116
Mohit Jain

pluckはdbレベルです。特定のフィールドのみを照会します。 こちらを参照

行うとき:

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

すべてのフィールドがロードされたオブジェクトがあり、Enumerableに基づくメソッドのおかげでidを取得するだけです。

そう:

  • onlyが必要な場合は、Rails 4でid 4を使用し、idsUser.first.gifts.idsを使用します

  • onlyがRails 4のフィールドを必要とする場合、pluckを使用します:User.first.gifts.pluck(:id, :name, ...)

  • onlyのみがRails 3のフィールドを必要とする場合、pluckを使用:User.first.gifts.pluck(:id)

  • allフィールドが必要な場合は、collectを使用します

  • Rails 4のフィールドが必要な場合は、pluckを使用します

  • Rails 3のフィールドが必要な場合は、selectcollectを使用します

219
apneadiving

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

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

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

基本的な主な違いは、Pluckはdbレベルで適用され、collectはすべてのデータを取得し、すべてのレコードがcollectを使用する必要があり、いくつかのフィールドがpluckを使用する場合にレコードを返すことです。

2
Thorin

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

User.collect(&:email)

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

注:pluckは、ユーザーのActiveRecord_Relationを返しません。

0
Chimed Palden