¿Cómo puedo contar la cantidad de registros que tienen un valor único en un campo particular en ROR?
-
09-06-2019 - |
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.
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).