update rails query left includes create active ruby-on-rails activerecord

ruby on rails - rails - Rieles: seleccione valores únicos de una columna



rails sql query (11)

Algunas respuestas no toman 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:

Model.uniq.select(:ratings).map(&:ratings) => "SELECT DISTINCT ratings FROM `models` "

Porque, primero genera una matriz de Modelo (con tamaño disminuido debido a la selección), luego extrae el único atributo que tienen esos modelos seleccionados (calificaciones)

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 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


Esto funciona tambien

Model.pluck("DISTINCT rating")


Otra forma de recopilar columnas uniq con sql:

Model.group(:rating).pluck(:rating)


Si alguien está buscando lo mismo con Mongoid, eso es

Model.distinct(:rating)


Si desea también seleccionar campos extra:

Model.select(''DISTINCT ON (models.ratings) models.ratings, models.id'').map { |m| [m.id, m.ratings] }


Si va a usar Model.select , entonces también puede usar DISTINCT , ya que solo devolverá 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 le dice a Rails que elija los valores únicos.

Model.select(''DISTINCT rating'')

Por supuesto, esto se proporciona si su base de datos comprende la palabra clave DISTINCT , y la mayoría debería hacerlo.


Si voy a la derecha entonces:

Consulta actual

Model.select(:rating)

está devolviendo una matriz de objeto y ha escrito la consulta

Model.select(:rating).uniq

uniq se aplica a la 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 maneras de seleccionar la calificación distinta:

Model.select(''distinct rating'').map(&:rating)

o

Model.select(''distinct rating'').collect(&:rating)

o

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

o

Model.select(:name).collect(&:rating).uniq

Una cosa más, la primera y la segunda consulta: encontrar datos distintos por consulta SQL.

Estas consultas se considerarán "londres" y "londres", lo mismo significa que descuidará el espacio, por eso seleccionará ''londres'' una vez en el resultado de la consulta.

Tercera y cuarta consulta:

encuentre 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 la consulta.

por favor, prefiera la imagen adjunta para una mejor comprensión y vea "Toured / Awaiting RFP".


Model.select(:rating)

El resultado de esto es una colección de objetos Model . No simples calificaciones. Y desde el punto de vista de uniq , son completamente diferentes. Puedes usar esto:

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

o este (mas eficiente)

Model.uniq.pluck(:rating) # rails 5+ Model.distinct.pluck(:rating)

Actualizar

Aparentemente, a partir de los rieles 5.0.0.1, funciona solo en consultas de "nivel superior", como arriba. No funciona en servidores proxy de recopilación (relaciones "has_many", por ejemplo).

Address.distinct.pluck(:city) # => [''Moscow''] user.addresses.distinct.pluck(:city) # => [''Moscow'', ''Moscow'', ''Moscow'']

En este caso, deduplicar después de la consulta.

user.addresses.pluck(:city).uniq # => [''Moscow'']


Model.select(:rating).distinct


Model.select(:rating).uniq

Este código funciona como ''DISTINTO'' (no como Array # uniq) desde los rieles 3.2


Model.uniq.pluck(:rating) # SELECT DISTINCT "models"."rating" FROM "models"

Esto tiene las ventajas de no usar cadenas sql y no ejemplificar modelos