以下に2つのサンプルコードを示します。
最初のcollect
:
User.first.gifts.collect(&:id)
2番目のpluck
の場合:
User.first.gifts.pluck(:id)
パフォーマンスと他の何かに違いはありますか?
pluck
はdbレベルです。特定のフィールドのみを照会します。 こちらを参照 。
行うとき:
User.first.gifts.collect(&:id)
すべてのフィールドがロードされたオブジェクトがあり、Enumerableに基づくメソッドのおかげでid
を取得するだけです。
そう:
onlyが必要な場合は、Rails 4でid
4を使用し、ids
:User.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のフィールドが必要な場合は、select
とcollect
を使用します
はい。 Railsガイドによる 、pluck
は、array
オブジェクトを構築せずに、データベースの結果をActiveRecord
に直接変換します。これは、大規模なクエリまたは頻繁に実行されるクエリのパフォーマンスが向上することを意味します。
@apneadivingの答えに加えて、pluck
は引数として単一列名と複数列名の両方を取ることができます。
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
基本的な主な違いは、Pluckはdbレベルで適用され、collectはすべてのデータを取得し、すべてのレコードがcollectを使用する必要があり、いくつかのフィールドがpluckを使用する場合にレコードを返すことです。
取得したレコードの属性をほとんど使用していない場合。そのような場合は、pluck
を使用する必要があります。
User.collect(&:email)
上記の例では、メール属性のみが必要な場合、メモリと時間を無駄にしています。データベースのユーザーテーブルからすべての列を取得するため、各属性(使用しない属性を含む)にメモリを割り当てます
注:pluck
は、ユーザーのActiveRecord_Relationを返しません。