User.find([1,2,3])
我想仅在用户模型中获取name
。我不想循环一个对象,所以我尝试了:
User.find([1,2,3]).pluck(:name)
但没有运气。如何使用pluck
行为执行以下方案?
答案 0 :(得分:6)
pluck
适用于ActiveRecord::Relation
。 find
会返回您的对象。
我假设您要使用pluck
,因为它会创建单个SQL查询并单独获取name
而不是获取所有记录并循环遍历它们{{1得到map
在这种情况下,您可能希望使用name
之类的
where
与User.where(id: [1,2,3]).pluck(:name)
链接的 where
将是您用例的最佳方式。
答案 1 :(得分:4)
Pluck
将不起作用。所以不要使用pluck
:
User.find([1,2,3]).pluck(:name)
尝试使用map
:
User.find([1,2,3]).map(&:name)
答案 2 :(得分:4)
find
方法返回一个数组,pluck
不是数组方法:
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
进行操作,可以这样做:
User.find([1,2,3]).collect(&:name)
或者
你可以这样做:
User.where(id: [1,2,3]).pluck(:name)
如果您需要pluck
和collect
之间的差异,可以参考:
What is the difference between pluck and collect in Rails?
Rails 5的更新
在rails 5中,这将起作用:
User.find([1,2,3]).pluck(:name)
正如Зелёный所述,pluck
方法现已添加到Enumerable
个对象中。
答案 3 :(得分:3)
在rails 5
它应该可以正常工作。但它不适用于任何旧版本。
但我认为使用where
更合适,
User.where(id: [1,2,3]).pluck(:name)
如果找不到find
的一个或多个记录,ActiveRecord::RecordNotFound
会引发id: [1,2,3]
错误。