地图,收集,选择和采摘之间哪个更快?

时间:2017-07-27 09:55:49

标签: ruby-on-rails ruby activerecord rails-activerecord

我一直在使用不同的方法从活动记录中获取特定字段,但哪一种更快更易于使用,它们之间的区别如何?

User.all.collect(&:name)
User.all.pluck(:name)
User.all.select(:name)
User.all.map(&:name)

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

使用任何这些方法都需要不同的用例:

selectpluck都会生成SQL's SELECT个指定列(SELECT "users"."name" FROM "users")。因此,如果您没有提取users而不去,则这些方法将比map/collect更具性能。

selectpluck之间的差异:

  • 表现:使用合理数量的记录时可忽略不计
  • 用法:select返回指定列的模型列表,pluck返回指定列的值列表。因此,再次,选择取决于用例。

collect/map方法实际上是别名,因此它们之间没有区别。但是为了迭代模型,他们获取整个模型(而不是特定的列),他们发出SELECT "users".* FROM "users"请求,将关系转换为数组并映射到它。

当已经获取关系时,这可能很有用。如果是这样,它将不会提出额外的请求,最终可能会比使用pluckselect更高效。但是,必须再次测量特定用例。

答案 1 :(得分:3)

pluck:从用户中检索名称,将它们作为字符串放入数组中(在本例中)并将其提供给您。

select:只使用'名称'从db检索所有用户列并返回一个关系。

collect / map(别名):从db中检索所有列的所有用户,将它们放在包含所有字段的User个对象数组中,然后转换每个对象只是名称并给你这个名字数组。

我把它按性能顺序给我。