110 votos

Rieles: seleccione los valores únicos de una columna

Ya tengo una solución de trabajo, pero realmente me gustaría saber por qué esto no funciona:

ratings = Model.select(:rating).uniq
ratings.each { |r| puts r.rating }

Selecciona, pero no de impresión de valores únicos, que se imprime todos los valores, incluyendo los duplicados. Y es en la documentación: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields

220voto

Sergio Tulentsev Puntos 82783
Model.select(:rating)

Resultado de esto es una matriz de Model objetos. No llanura de calificaciones. Y a partir de uniq's punto de vista, son completamente diferentes. Usted puede usar esto:

Model.select(:rating).map(&:rating).uniq

o esta (la más eficiente)

Model.uniq.pluck(:rating)

60voto

kakubei Puntos 1526

Si vas a usar Model.select, entonces usted puede ser que también acaba de uso DISTINCT, ya que sólo devuelve los valores únicos. Este es mejor, porque significa que devuelve menos filas y debe ser ligeramente más rápido que la devolución de un número de filas y, a continuación, diciendo Rieles para recoger los valores únicos.

Model.select('DISTINCT rating')

Por supuesto, esto es siempre que su base de datos comprende la DISTINCT de palabras clave, y la mayoría de los que debería.

34voto

Nat Puntos 643

Esto también funciona.

Model.pluck("DISTINCT rating")

21voto

Cameron Martin Puntos 826
Model.uniq.pluck(:rating)

# SELECT DISTINCT "models"."rating" FROM "models"

Esto tiene las ventajas de no usar cadenas sql y no crear instancias de modelos

15voto

kuboon Puntos 1033
Model.select(:rating).uniq

Este código funciona desde rails 3.2

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X