¿Cómo puedo contar la cantidad de registros que tienen un valor único en un campo particular en ROR?

StackOverflow https://stackoverflow.com/questions/36608

Pregunta

Tengo un conjunto de registros que incluye un campo de fecha y quiero determinar cuántas fechas únicas están representadas en el conjunto de registros.

Algo como:

Record.find(:all).date.unique.count 

pero claro, eso no parece funcionar.

¿Fue útil?

Solución

Lo que estás buscando es el siguiente SQL:

SELECT COUNT(DISTINCT date) FROM records

ActiveRecord tiene esto integrado:

Record.count('date', :distinct => true)

Otros consejos

Esto ha cambiado ligeramente en los carriles 4 y superiores. :distinct => true ahora está en desuso.Usar:

Record.distinct.count('date')

O si quieres la fecha y el número:

Record.group(:date).distinct.count(:date)

Fuera de SQL:

Record.find(:all).group_by(&:date).count

ActiveSupport Enumerable#group_by es indispensable.

lo último #count El código fuente de On Rails solo acepta 1 parámetro.ver: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count

así que logré el requisito por

Record.count('DISTINCT date')

Detallando la respuesta:

Post.create(:user_id => 1, :created_on => '2010-09-29')
Post.create(:user_id => 1, :created_on => '2010-09-29')
Post.create(:user_id => 2, :created_on => '2010-09-29')
Post.create(:user_id => null, :created_on => '2010-09-29')

Post.group(:created_on).count
# => {'2010-09-29' => 4}

Post.group(:created_on).count(:user_id)
# => {'2010-09-29' => 3}

Post.group(:created_on).count(:user_id, :distinct => true) # Rails <= 3
Post.group(:created_on).distinct.count(:user_id) # Rails = 4
# => {'2010-09-29' => 2}

Como he mencionado aquí, en Rails 4, usando (...).uniq.count(:user_id) como se menciona en otras respuestas (para esta pregunta y en otras partes de SO) en realidad conducirá a un extra DISTINCT estando en la consulta:

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

Lo que realmente tenemos que hacer es usar una cadena SQL nosotros mismos:

(...).count("DISTINCT user_id")

Lo que nos da:

SELECT COUNT(DISTINCT user_id) FROM ...

Además, asegúrese de tener un índice en el campo en su base de datos, de lo contrario esa consulta se volverá lenta rápidamente.

(Es mucho mejor hacer esto en SQL; de lo contrario, guardará toda la tabla de base de datos en la memoria solo para responder al recuento).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top