Ya tengo una solución que funciona, 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 imprime valores únicos, imprime todos los valores, incluidos los duplicados. Y está en la documentación: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
ruby-on-rails
activerecord
alexandrecosta
fuente
fuente
Respuestas:
El resultado de esto es una colección de
Model
objetos. No clasificaciones simples. Y desdeuniq
el punto de vista, son completamente diferentes. Puedes usar esto:o esto (más eficiente)
Actualizar
Aparentemente, a partir de rails 5.0.0.1, solo funciona en consultas de "nivel superior", como las anteriores. No funciona en proxies de colección (relaciones "has_many", por ejemplo).
En este caso, deduplicar después de la consulta
fuente
Model.uniq.pluck(:rating)
es la forma más eficiente de hacer esto: esto genera SQL que usa enSELECT DISTINCT
lugar de aplicar.uniq
a una matrizModel.uniq.pluck(:rating)
seráModel.distinct.pluck(:rating)
Model.related_records.group(:some_column).pluck(:some_column)
Si va a usar
Model.select
, entonces también podría usarDISTINCT
, ya que devolverá solo los valores únicos. Esto es mejor porque significa que devuelve menos filas y debería ser un poco más rápido que devolver varias filas y luego decirle a Rails que elija los valores únicos.Por supuesto, esto se proporciona si su base de datos comprende la
DISTINCT
palabra clave, y la mayoría debería.fuente
Model.select("DISTINCT rating").map(&:rating)
para obtener una variedad de solo las calificaciones.Esto tambien funciona.
fuente
pluck
es un método puro de Rails> 3.2 que no depende de Ruby 1.9.x Ver apidock.com/rails/v3.2.1/ActiveRecord/Calculations/pluckSi también desea seleccionar campos adicionales:
fuente
select extra fields
<3 <3Esto tiene las ventajas de no usar cadenas sql y no crear modelos de instancia
fuente
Este código funciona como 'DISTINCT' (no como Array # uniq) ya que rails 3.2
fuente
fuente
.pluck(:rating)
embargo , agregar al final hará que sea exactamente lo que solicitó el OP.Si voy directo al camino, entonces:
Consulta actual
está devolviendo una matriz de objetos y ha escrito consulta
uniq se aplica en una matriz de objetos y cada objeto tiene una identificación única. uniq está realizando su trabajo correctamente porque cada objeto en la matriz es uniq.
Hay muchas formas de seleccionar una calificación distinta:
o
o
o
Una cosa más, primera y segunda consulta: encuentre datos distintos por consulta SQL.
Estas consultas se considerarán "londres" y "londres" lo mismo significa que descuidará el espacio, es por eso que seleccionará 'londres' una vez en el resultado de su consulta.
Tercera y cuarta consulta:
buscar datos por consulta SQL y para datos distintos aplicados ruby uniq mehtod. estas consultas se considerarán "londres" y "londres" diferentes, por eso seleccionará 'londres' y 'londres' en el resultado de su consulta.
por favor, prefiera la imagen adjunta para una mejor comprensión y eche un vistazo a "Recorrido / En espera de RFP".
fuente
map
&collect
son alias para el mismo método, no hay necesidad de proporcionar ejemplos para ambos.Algunas respuestas no tienen en cuenta que el OP quiere una matriz de valores
Otras respuestas no funcionan bien si su modelo tiene miles de registros
Dicho esto, creo que una buena respuesta es:
Porque, primero genera una matriz de Modelo (con un tamaño disminuido debido a la selección), luego extrae el único atributo que tienen esos modelos seleccionados (calificaciones)
fuente
Si alguien está buscando lo mismo con Mongoid, eso es
fuente
Otra forma de recopilar columnas uniq con sql:
fuente