Как подсчитать количество записей, имеющих уникальное значение в определенном поле в ROR? - PullRequest
63 голосов
/ 31 августа 2008

У меня есть набор записей, включающий поле даты, и я хочу определить, сколько уникальных дат представлено в наборе записей.

Что-то вроде:

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

но, конечно, это не работает.

Ответы [ 7 ]

101 голосов
/ 14 октября 2013

Это немного изменилось в рельсах 4 и выше :distinct => true устарела. Использование:

Record.distinct.count('date')

Или, если вы хотите дату и число:

Record.group(:date).distinct.count(:date)
81 голосов
/ 31 августа 2008

То, что вы собираетесь, это следующий SQL:

SELECT COUNT(DISTINCT date) FROM records

ActiveRecord имеет это встроенное:

Record.count('date', :distinct => true)
16 голосов
/ 02 сентября 2008

За пределами SQL:

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

ActiveSupport's Enumerable # group_by обязателен.

12 голосов
/ 21 июня 2017

последний #count в исходном коде рельсов принимает только 1 параметр. см .: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count

поэтому я выполнил требование на

Record.count('DISTINCT date')
10 голосов
/ 23 июля 2014

Детализация ответа:

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}
9 голосов
/ 12 октября 2015

Как я уже упоминал здесь , в Rails 4 использование (...).uniq.count(:user_id), как упоминалось в других ответах (для этого вопроса и в других местах на SO), фактически приведет к дополнительному DISTINCT в запросе:

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

Что нам действительно нужно сделать, так это самим использовать строку SQL:

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

Что дает нам:

SELECT COUNT(DISTINCT user_id) FROM ...

2 голосов
/ 16 сентября 2008

Кроме того, убедитесь, что у вас есть индекс в поле в вашей базе данных, иначе этот запрос быстро станет sloooow.

(Гораздо лучше сделать это в SQL, в противном случае вы извлекаете всю таблицу базы данных в память просто для ответа на счет.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...