131

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

最初のものcollect

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

2番目のものpluck

User.first.gifts.pluck(:id)

それらの間にパフォーマンスまたは何か他の違いはありますか?

4

4 に答える 4

244

pluckdbレベルです。特定のフィールドのみを照会します。これを参照してください

あなたがするとき:

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

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

そう:

  • Rails 4のみが必要な場合は、次を使用します。ididsUser.first.gifts.ids

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

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

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

  • Rails 4でいくつかのフィールドが必要な場合でも、引き続き使用しますpluck

  • Rails 3 でいくつかのフィールドが必要な場合は、 and を使用selectしますcollect

于 2012-08-29T10:43:16.143 に答える
4

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

于 2016-05-04T16:15:57.633 に答える
3

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

User.collect(&:email)

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

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

于 2019-01-16T11:01:22.300 に答える