2016-07-22 14 views
-1
User.find([1,2,3]) 

私はnameをユーザーモデルでのみ取得したいと考えています。私はオブジェクトにループしたくないので、試しました:選択したオブジェクトを引き出す

User.find([1,2,3]).pluck(:name) 

運がありません。 pluckの動作を使用して、次のシナリオを実行するにはどうすればよいですか?

答えて

2

Pluckはその場合は機能しません。だからではなく、pluckを使用する:

User.find([1,2,3]).pluck(:name) 

mapを使用してみてください:

User.find([1,2,3]).map(&:name) 
2

rails 5では、それが正常に動作する必要があります。しかし、それは古いバージョンではうまくいきません。

しかし、私はid: [1,2,3]と1つ以上のレコードが見つからない場合はwhereを使用すると、

User.where(id: [1,2,3]).pluck(:name) 

findため、昇給ActiveRecord::RecordNotFoundエラーがより適していると思います。

3

find方法は、アレイとpluckは、アレイ法ではありません返します

User.find([1,2,3]).collect(&:name) 

または

2.1.1 :001 > User.find([1,2,3]).pluck(:name) 
    User Load (3.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2, 3) 
NoMethodError: undefined method `pluck' for #<Array:0x0000000f22ed90> 

ですから、findを使用してそれを実行したい場合は、このようにそれを行うことができます

このようにすることができます:

あなたは pluckcollectの違いが必要な場合は
User.where(id: [1,2,3]).pluck(:name) 

そして、あなたはこれを参照することがあります。

What is the difference between pluck and collect in Rails?

アップデートをレール5では5

が、これは動作しますRailsのために:

User.find([1,2,3]).pluck(:name) 

としてЗелёныйpluckメソッドがEnumerableオブジェクトに追加されました。

+0

は(https://github.com/rails/rails/pull/20350)[列挙法である]、それは上に呼び出すことができます配列。 –

+0

ありがとう@更新日時:Зелёный私は答えを更新しました。 – Deep

+0

回答を受け入れる必要があります –

4

pluckActiveRecord::Relationで動作します。 findはあなたにオブジェクトを返します。私が想定し

は、あなたはそれが単一のSQLクエリになるだろうという理由pluckを使用すると、むしろそれらのすべてのレコードをフェッチしname

を取得するんmapのようにそれらをループよりもname Sのみを取得したいですその場合、あなたはあなたのユースケースに最適な方法だろう

pluckと連鎖し
User.where(id: [1,2,3]).pluck(:name) 

whereようwhereを使用したいと思います。

ドキュメント:レール5 `pluck`においてfindwherepluck

関連する問題