我有一个包含日期字段的记录集,并希望确定记录集中表示的唯一日期数.
就像是:
Record.find(:all).date.unique.count
但当然,这似乎不起作用.
在rails 4及以上版本中略有改变:distinct => true
现已弃用.使用:
Record.distinct.count('date')
或者如果你想要日期和数字:
Record.group(:date).distinct.count(:date)
您要的是以下SQL:
SELECT COUNT(DISTINCT date) FROM records
ActiveRecord内置了这个:
Record.count('date', :distinct => true)
在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
查询中出现额外的问题:
SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...
我们实际需要做的是自己使用SQL字符串:
(...).count("DISTINCT user_id")
这给了我们:
SELECT COUNT(DISTINCT user_id) FROM ...