地图、收集、选择、采摘哪个更快?

问题描述 投票:0回答:2

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

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

感谢您提前的帮助。

ruby-on-rails ruby activerecord rails-activerecord
2个回答
16
投票

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

select
pluck
都会生成指定列 (
SQL's SELECT
) 的
SELECT  "users"."name" FROM "users"
。因此,如果您没有已获取且不打算获取
users
,这些方法将比
map/collect
性能更高。

select
pluck
的区别:

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

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

当关系已经被获取时,这可能很有用。如果是这样,它不会提出额外的请求,这可能比使用

pluck
select
性能更高。但是,再次强调,必须针对特定用例进行测量。


7
投票

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

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

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

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

几年后编辑:现在

pluck
甚至作为可枚举的方法存在,不仅适用于活动记录关系,而且它的工作方式与map

相同
© www.soinside.com 2019 - 2024. All rights reserved.