validar recursos rails formularios formulario anidados ruby-on-rails ruby activerecord

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)


Fuera de SQL:

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

El Enumerable#group_by es indispensable.


Lo que está buscando es el siguiente SQL:

SELECT COUNT(DISTINCT date) FROM records

ActiveRecord tiene esto integrado:

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