[PT-BR] pluck vs. select
Source: Dev.to
pluck
No Rails, temos o pluck, que retorna um array com os valores dos atributos que você selecionou.
Doctor.pluck(:id)
#=> [1, 3, 7, 8, 9, 5]
Se você passa mais de um atributo, o pluck retorna um array de arrays, cada sub‑array contendo os valores dos atributos solicitados:
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]
# ]
A query gerada busca somente os atributos especificados:
SELECT "doctors"."id", "doctors"."updated_at" FROM "doctors"
select
O select faz a mesma consulta SQL, porém retorna um ActiveRecord::Relation contendo objetos do modelo:
Doctor.select(:id, :updated_at)
#=> #<ActiveRecord::Relation [...]>
Exemplo de log da consulta:
Doctor.select(:id, :updated_at)
# Doctor Load (0.3ms) SELECT "doctors"."id", "doctors"."updated_at" FROM "doctors"
Comparação
| Método | Retorno | Tipo de objeto |
|---|---|---|
pluck | Array (ou array de arrays) | Array |
select | Conjunto de registros ActiveRecord | ActiveRecord::Relation (model objects) |
Ambos geram a mesma consulta SQL:
SELECT "doctors"."id", "doctors"."updated_at" FROM "doctors"
A diferença está no formato dos dados retornados: pluck entrega apenas os valores puros, enquanto select entrega instâncias completas do modelo, permitindo acesso a métodos de instância e associações.