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?
pluckestá 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 idgracias al método basado en Enumerable.
Entonces:
si solo necesita el idcon 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 selectycollect
pluckcon múltiples atributos, comopluck(:id, :name)?pluckmúltiples campos, Rails 3 no, a menos que use la solución alternativa de Ryan Lefevreid, use.idsRef doc: api.rubyonrails.org/classes/ActiveRecord/…Si. Según las guías de Rails ,
pluckconvierte directamente el resultado de una base de datos en unarray, sin construirActiveRecordobjetos. Esto significa un mejor rendimiento para una consulta grande o que se ejecuta con frecuencia.Además de la respuesta de @ apneadiving,
pluckpuede 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:
pluckno devuelve ActiveRecord_Relation del usuariofuente