我有一个包含日期字段的记录集,并想确定记录集中代表多少个唯一日期。
类似的东西:
1
| Record.find(:all).date.unique.count |
但是,那似乎不起作用。
在滑轨4中的更改略有变化,现在已弃用:distinct => true。用途:
1
| Record.distinct.count('date') |
或者如果您想要日期和数字:
1
| Record.group(:date).distinct.count(:date) |
您要使用的是以下SQL:
1
| SELECT COUNT(DISTINCT date) FROM records |
ActiveRecord具有以下内置功能:
1
| Record.count('date', :distinct => true) |
SQL之外:
1
| 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
所以我达到了
的要求
1
| Record.count('DISTINCT date') |
详细说明答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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:
SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...
我们实际上要做的是自己使用一个SQL字符串:
(...).count("DISTINCT user_id")
哪个给我们:
SELECT COUNT(DISTINCT user_id) FROM ...
此外,请确保您在数据库中的字段上有一个索引,否则该查询将很快变得毫无用处。
(最好在SQL中执行此操作,否则您将整个db表拉入内存只是为了回答计数。)