Как подсчитать количество записей, имеющих уникальное значение в определенном поле в ROR?

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

Вопрос

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

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

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

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

Это было полезно?

Решение

Для чего вам нужен следующий SQL:

SELECT COUNT(DISTINCT date) FROM records

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

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

Другие советы

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

Record.distinct.count('date')

Или, если вы хотите дату и номер:

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

Вне SQL:

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

ActiveSupport Enumerable # group_by незаменим.

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

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

Record.count('DISTINCT date')

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

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}

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

ВЫБЕРИТЕ DISTINCT COUNT (DISTINCT user_id) FROM ...

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

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

Что дает нам:

SELECT COUNT (DISTINCT user_id) FROM ...

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top