Aquí hay dos códigos de muestra.
Primero con collect
:
User.first.gifts.collect(&:id)
Segundo con pluck
:
User.first.gifts.pluck(:id)
¿Hay alguna diferencia entre ellos en el rendimiento o alguna otra cosa?
Aquí hay dos códigos de muestra.
Primero con collect
:
User.first.gifts.collect(&:id)
Segundo con pluck
:
User.first.gifts.pluck(:id)
¿Hay alguna diferencia entre ellos en el rendimiento o alguna otra cosa?
Respuestas:
pluck
está en el nivel de base de datos. Solo consultará el campo en particular. Mira esto .
Cuando tu lo hagas:
User.first.gifts.collect(&:id)
Tiene objetos con todos los campos cargados y simplemente obtiene las id
gracias al método basado en Enumerable.
Entonces:
si solo necesita el id
con Rails 4, use ids
:User.first.gifts.ids
si solo necesita algunos campos con Rails 4, use pluck
:User.first.gifts.pluck(:id, :name, ...)
si solo necesita un campo con Rails 3, use pluck
:User.first.gifts.pluck(:id)
si necesita todos los campos, usecollect
si necesita algunos campos con Rails 4, aún use pluck
si necesita algunos campos con Rails 3, use select
ycollect
pluck
múltiples campos, Rails 3 no, a menos que use la solución alternativa de Ryan Lefevre
Si. Según las guías de Rails , pluck
convierte directamente el resultado de una base de datos en un array
, sin construir ActiveRecord
objetos. Esto significa un mejor rendimiento para una consulta grande o que se ejecuta con frecuencia.
Además de la respuesta de @ apneadiving, pluck
puede tomar nombres de columnas simples y múltiples como argumento:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
Si hay un caso en el que está utilizando pocos atributos del registro recuperado. En tales casos debes usar pluck
.
User.collect(&:email)
En el ejemplo anterior, si solo necesita un atributo de correo electrónico, está desperdiciando memoria y tiempo. Debido a que recuperará todas las columnas de la tabla de usuario en la base de datos, asigna la memoria para cada atributo (incluidos los atributos que nunca usará)
NOTA: pluck
no devuelve ActiveRecord_Relation del usuario
pluck
con múltiples atributos, comopluck(:id, :name)
?