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?
fuente
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?
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
con múltiples atributos, comopluck(:id, :name)
?pluck
múltiples campos, Rails 3 no, a menos que use la solución alternativa de Ryan Lefevreid
, use.ids
Ref doc: api.rubyonrails.org/classes/ActiveRecord/…Si. Según las guías de Rails ,
pluck
convierte directamente el resultado de una base de datos en unarray
, sin construirActiveRecord
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:fuente
La diferencia básica y principal es que Pluck se aplica en el nivel db y collect para obtener todos los datos y luego devolverle el registro cuando necesite que todos los registros usen collect y cuando pocos campos usen pluck
fuente
Si hay un caso en el que está utilizando pocos atributos del registro recuperado. En tales casos debes usar
pluck
.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 usuariofuente