我一直在使用不同的方法从活动记录中获取特定字段,但哪一种更快更易于使用,它们之间的区别如何?
User.all.collect(&:name)
User.all.pluck(:name)
User.all.select(:name)
User.all.map(&:name)
提前感谢您的帮助。
答案 0 :(得分:4)
使用任何这些方法都需要不同的用例:
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
更高效。但是,必须再次测量特定用例。
答案 1 :(得分:3)
pluck
:从用户中检索名称,将它们作为字符串放入数组中(在本例中)并将其提供给您。
select
:只使用'名称'从db检索所有用户列并返回一个关系。
collect
/ map
(别名):从db中检索所有列的所有用户,将它们放在包含所有字段的User
个对象数组中,然后转换每个对象只是名称并给你这个名字数组。
我把它按性能顺序给我。