这里有两段示例代码。
第一段使用了 collect
:
User.first.gifts.collect(&:id)
使用pluck
的第二个方法:
User.first.gifts.pluck(:id)
它们在性能或其他方面有任何区别吗?
这里有两段示例代码。
第一段使用了 collect
:
User.first.gifts.collect(&:id)
使用pluck
的第二个方法:
User.first.gifts.pluck(:id)
它们在性能或其他方面有任何区别吗?
pluck
是在数据库层面上执行的。它只会查询特定的字段。请参考这里。 User.first.gifts.collect(&:id)
你有一些包含所有字段的对象,只需要通过基于 Enumerable 的方法获取 id
。
因此:
如果你在 Rails 4 中仅仅需要id
,请使用ids
:User.first.gifts.ids
如果你在 Rails 4 中仅仅需要一些字段,请使用pluck
:User.first.gifts.pluck(:id, :name, ...)
如果你在 Rails 3 中仅仅需要一个字段,请使用pluck
:User.first.gifts.pluck(:id)
如果你需要全部字段,请使用collect
如果你在 Rails 4 中需要一些字段,请仍然使用pluck
如果你在 Rails 3 中需要一些字段,请使用select
和collect
是的。根据Rails指南中的说明,pluck
将数据库结果直接转换为一个数组,而不构建ActiveRecord
对象。这意味着对于大型或经常运行的查询,性能更好。
除了@apneadiving的答案外,pluck
还可以将单个和多个列名作为参数:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
虽然来晚了,但如果您想要更深入的提取,可以使用includes
:
User.all.includes(:groups).pluck("users.id", "users.name", "groups.id", "groups.name")
[
[12, "Sam", 4, "FriendsRUs"],
...
]
pluck
。User.collect(&:email)
collect
会加载数据库中的所有属性,而pluck
只会加载你指定的属性。比如说,当你执行以下代码时:User.all.collect(&:id)
这将在内存中加载所有用户记录的属性并返回其ID。当您执行以下操作时:
User.all.pluck(:id)
这样只加载 id 到内存中,所以在你只需要访问少量属性的情况下更加高效。
pluck
数据,而Rails 3则不支持,除非你使用Ryan Lefevre的解决方法。 - marksiemersid
,可以使用.ids
。参考文档:http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-ids - Ivan Chau