在Rails中pluck和collect之间有什么区别?


Answers:


230

pluck在数据库级别。它只会查询特定的字段。看到这个

当您这样做时:

 User.first.gifts.collect(&:id)

您拥有装载了所有字段的对象,并且您只需要id感谢基于Enumerable的方法。

所以:

  • 如果需要idwith Rails 4,请使用idsUser.first.gifts.ids

  • 如果您需要Rails 4的某些字段,请使用pluckUser.first.gifts.pluck(:id, :name, ...)

  • 如果您需要Rails 3的一个字段,请使用pluckUser.first.gifts.pluck(:id)

  • 如果需要所有字段,请使用collect

  • 如果您需要Rails 4的某些字段,请继续使用 pluck

  • 如果您需要Rails 3的某些字段,请使用selectcollect


“如果需要一些字段,请使用selectand collect”-您不能仅使用pluck多个属性,例如pluck(:id, :name)吗?
亚历山大

@AlexPopov-Rails 4+支持pluck多个字段,Rails 3不支持,除非您使用Ryan Lefevre的变通方法
markiemers 2015年

3
在Rails 4中,如果需要使用id,请使用.idsRef doc:api.rubyonrails.org/classes/ActiveRecord/…–
Ivan Chau

30

是。根据导轨引导件pluck直接数据库结果转换为array,无需构建ActiveRecord对象。这意味着大型或经常运行的查询具有更好的性能。

除了@apneadiving的答案,pluck还可以同时使用单列名称和多列名称作为参数:

Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]

3

基本和主要的区别在于,Pluck适用于数据库级别并收集获取所有数据,然后在您需要所有记录使用collect且少数字段随后使用pluck时将记录返回给您


2

如果存在使用检索到的记录的少量属性的情况。在这种情况下,您应该使用pluck

User.collect(&:email)

在上面的示例中,如果您只需要电子邮件属性,那么您将浪费内存和时间。因为它将从数据库的用户表中检索所有列,所以为每个属性(包括您永远不会使用的属性)分配内存

注意:pluck不返回用户的ActiveRecord_Relation

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.