131

这是两个示例代码。

第一个collect

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

第二个pluck

User.first.gifts.pluck(:id)

它们在性能或其他方面有什么区别吗?

4

4 回答 4

244

pluck是在分贝级别。它只会查询特定的字段。看到这个

当你这样做时:

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

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

所以:

  • 如果您需要id使用 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

于 2012-08-29T10:43:16.143 回答
33

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

除了@apneadiving 的答案之外,pluck还可以将单个和多个列名作为参数:

Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
于 2014-06-11T10:43:28.013 回答
4

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

于 2016-05-04T16:15:57.633 回答
3

如果在某些情况下您使用检索记录的少数属性。在这种情况下,您应该使用pluck.

User.collect(&:email)

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

注意:pluck不返回用户的 ActiveRecord_Relation

于 2019-01-16T11:01:22.300 回答