如何计算ROR中特定字段中具有唯一值的记录数?

时间:2008-08-31 03:19:33

标签: ruby-on-rails ruby activerecord

我有一个包含日期字段的记录集,并希望确定记录集中表示的唯一日期数。

类似的东西:

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

但当然,这似乎不起作用。

7 个答案:

答案 0 :(得分:101)

在rails 4中略有变化,现在已弃用:distinct => true以上Record.distinct.count('date') 。使用:

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

或者如果您想要日期和数字:

{{1}}

答案 1 :(得分:81)

您要使用的是以下SQL:

SELECT COUNT(DISTINCT date) FROM records

ActiveRecord内置了这个:

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

答案 2 :(得分:16)

SQL之外:

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

ActiveSupport的Enumerable#group_by是不可或缺的。

答案 3 :(得分:12)

最新的#count on rails源代码只接受1个参数。 见:http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count

所以我通过

达到了要求
Record.count('DISTINCT date')

答案 4 :(得分:10)

详细说明答案:

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}

答案 5 :(得分:9)

正如我提到的here,在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 ...

答案 6 :(得分:2)

此外,请确保您的数据库中的字段有索引,否则该查询将很快变为缓慢。

(在SQL中执行此操作要好得多,否则只需将整个db表拉入内存即可回答计数。)