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

Tou*_*eer 6 ruby activerecord ruby-on-rails rails-activerecord

我一直在使用不同的方法从活动记录中获取特定字段,但是哪种方法更快且更受欢迎,它们之间有何不同?

User.all.collect(&:name)
User.all.pluck(:name)
User.all.select(:name)
User.all.map(&:name)
Run Code Online (Sandbox Code Playgroud)

提前感谢您的帮助。

Igo*_*dov 8

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

无论selectpluck化妆SQL's SELECT指定的列(SELECT "users"."name" FROM "users")。因此,如果您还没有users获取并且不打算获取,这些方法将比map/collect.

之间的差异selectpluck

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

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

当关系已经被获取时,这可能很有用。如果是这样,它不会发出额外的请求,最终可能比使用pluckor更高效select。但是,同样,必须针对特定用例进行衡量。

  • “性能:可忽略不计” - 查询确实是相同的。但是实例化数千个 AR 对象远非免费。所有这些都需要在 OP 的环境中进行测量。我们只能在这里挥手胡乱猜测:) (2认同)

Urs*_*sus 7

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

select:仅使用“name”列从数据库检索所有用户并返回一个关系。

collect/ (别名):从数据库中检索所有用户的所有列,将它们放入具有所有字段map的对象数组中,然后仅将每个对象转换为名称,并将此名称数组提供给您。User

我把这个按我的表现顺序排列。

几年后编辑:现在pluck甚至作为可枚举的方法存在,不仅适用于活动记录关系,而且它的工作方式与地图相同