插入选定的对象

时间:2016-07-22 10:37:02

标签: ruby-on-rails ruby-on-rails-3

User.find([1,2,3])

我想仅在用户模型中获取name。我不想循环一个对象,所以我尝试了:

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

但没有运气。如何使用pluck行为执行以下方案?

4 个答案:

答案 0 :(得分:6)

pluck适用于ActiveRecord::Relationfind会返回您的对象。

我假设您要使用pluck,因为它会创建单个SQL查询并单独获取name而不是获取所有记录并循环遍历它们{{1得到map

在这种情况下,您可能希望使用name之类的

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

where将是您用例的最佳方式。

文档:findwherepluck

答案 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)

如果您需要pluckcollect之间的差异,可以参考:

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]错误。