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

我有一个包含date字段的logging集,并且想要确定logging集中代表了多less个唯一date。

就像是:

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

但当然,这似乎并不奏效。

你要做的是以下的SQL:

 SELECT COUNT(DISTINCT date) FROM records 

ActiveRecord有这个内置的:

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

这在轨道4和上面稍微改变了:distinct => true现在已经被弃用了。 使用:

 Record.distinct.count('date') 

或者如果你想要的date和数字:

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

SQL之外:

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

ActiveSupport的Enumerable#group_by是必不可less的。

正如我在这里提到的,在Rails 4中,使用(...).uniq.count(:user_id)在其他答案(对于这个问题和SO其他地方(...).uniq.count(:user_id)中提到的实际上会导致在查询中额外的DISTINCT

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

我们实际上必须做的是自己使用一个SQLstring:

(...).count("DISTINCT user_id")

这给了我们:

SELECT COUNT(DISTINCT user_id) FROM ...

详细解答:

 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} 

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

所以我达到了要求

 Record.count('DISTINCT date') 

此外,请确保您的数据库中的字段有一个索引,否则,该查询将很快成为懒惰。

(在SQL中执行此操作要好得多,否则将整个数据库表拖入内存中以回答计数。)