ruby-on-rails - formularios - recursos anidados rails
¿Cómo puedo contar la cantidad de registros que tienen un valor único en un campo particular en ROR? (7)
Tengo un conjunto de registros que incluye un campo de fecha y deseo determinar cuántas fechas únicas se representan en el conjunto de registros.
Algo como:
Record.find(:all).date.unique.count
pero por supuesto, eso no parece funcionar.
Además, asegúrese de tener un índice en el campo en su base de datos o, de lo contrario, esa consulta se volverá rápidamente lenta.
(Es mucho mejor hacer esto en SQL, de lo contrario, extrae toda la tabla db en la memoria solo para contestar el conteo).
Como mencioné here , en Rails 4, el uso de (...).uniq.count(:user_id)
como se menciona en otras respuestas (para esta pregunta y en otros lugares en SO) realmente dará lugar a un DISTINCT
adicional 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 ...
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}
Esto ha cambiado ligeramente en los rieles 4 y superiores :distinct => true
ahora está en desuso. Utilizar:
Record.distinct.count(''date'')
O si quieres la fecha y el número:
Record.group(:date).distinct.count(:date)
Lo que está buscando es el siguiente SQL:
SELECT COUNT(DISTINCT date) FROM records
ActiveRecord tiene esto integrado:
Record.count(''date'', :distinct => true)
el último código fuente #count
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'')