我有一个包含日期字段的记录集,并希望确定记录集中表示的唯一日期数。
类似的东西:
Record.find(:all).date.unique.count
但当然,这似乎不起作用。
答案 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)
答案 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表拉入内存即可回答计数。)