[PT-BR] pluck 对比 select
发布: (2026年5月1日 GMT+8 11:24)
2 分钟阅读
原文: Dev.to
Source: Dev.to
pluck
在 Rails 中,我们有 pluck,它返回一个包含所选属性值的数组。
Doctor.pluck(:id)
#=> [1, 3, 7, 8, 9, 5]
如果传入多个属性,pluck 会返回一个数组的数组,每个子数组包含请求的属性值:
Doctor.pluck(:id, :updated_at)
#=> [
# [1, Wed, 23 Jan 2019 11:44:27.924159000 EST -05:00],
# [3, Tue, 29 Jan 2019 15:47:30.056920000 EST -05:00],
# [7, Thu, 28 May 2020 19:30:29.238601000 EDT -04:00],
# [8, Thu, 28 May 2020 19:30:29.251257000 EDT -04:00],
# [9, Sat, 26 Jun 2021 19:56:41.536687000 EDT -04:00],
# [5, Tue, 28 Jun 2022 16:49:45.091360000 EDT -04:00]
# ]
生成的查询仅 检索 指定的属性:
SELECT "doctors"."id", "doctors"."updated_at" FROM "doctors"
select
select 执行相同的 SQL 查询,但返回一个包含模型对象的 ActiveRecord::Relation:
Doctor.select(:id, :updated_at)
#=> #<ActiveRecord::Relation [...]>
查询日志示例:
Doctor.select(:id, :updated_at)
# Doctor Load (0.3ms) SELECT "doctors"."id", "doctors"."updated_at" FROM "doctors"
比较
| 方法 | 返回值 | 对象类型 |
|---|---|---|
pluck | 数组(或数组的数组) | Array |
select | ActiveRecord 记录集合 | ActiveRecord::Relation(模型实例) |
两者生成相同的 SQL 查询:
SELECT "doctors"."id", "doctors"."updated_at" FROM "doctors"
区别在于返回数据的格式:pluck 只返回纯值,而 select 返回完整的模型实例,因而可以访问实例方法和关联。