Как подсчитать количество записей, имеющих уникальное значение в определенном поле в ROR?
-
09-06-2019 - |
Вопрос
У меня есть набор записей, включающий поле даты, и я хочу определить, сколько уникальных дат представлено в наборе записей.
Что-то вроде:
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)
последний #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, в противном случае вы извлекаете всю таблицу базы данных в память просто для того, чтобы ответить на счет.)