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

Moh*_*ain 117 ruby ruby-on-rails rails-activerecord

这是两个示例代码.

第一个collect:

User.first.gifts.collect(&:id)
Run Code Online (Sandbox Code Playgroud)

第二个pluck:

User.first.gifts.pluck(:id)
Run Code Online (Sandbox Code Playgroud)

他们在表现或其他方面有什么不同吗?

apn*_*ing 220

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

当你这样做时:

 User.first.gifts.collect(&:id)
Run Code Online (Sandbox Code Playgroud)

你有加载了所有字段的对象,你只需要id感谢基于Enumerable的方法.

所以:

  • 如果您需要id使用Rails 4,请使用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的字段,请使用selectcollect

  • 在Rails 4中,如果你*只需要`id`,请使用`.ids`参考文档:http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-ids (3认同)

Num*_*ers 26

是.根据Rails指南,pluck直接将数据库结果转换为a array,而不构造ActiveRecord对象.这意味着对于大型或经常运行的查询,性能会更好.

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

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