拾取选定的对象

Pluck in a selected object

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

我只想在用户模型中获得 name。我不想在对象中循环,所以我尝试了:

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

但运气不好。如何使用 pluck 行为执行以下场景?

Pluck 在这种情况下将不起作用。所以不用 pluck:

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

尝试使用 map:

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

rails 5 中它应该可以正常工作。但它不适用于任何旧版本。

不过我觉得用where更合适,

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

因为 find 如果找不到一条或多条带 id: [1,2,3] 的记录,则会引发 ActiveRecord::RecordNotFound 错误。

find方法return是一个数组,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 个对象。

pluck 适用于 ActiveRecord::Relationfindreturns你反对

我假设,您想使用 pluck 的原因是它会进行单个 SQL 查询并单独获取 names 而不是获取所有记录并循环像 map 那样超越他们以获得 name

在那种情况下,你会想使用 where 就像

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

wherepluck 链接将是您用例的最佳方式。

文档:find, where and pluck