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

Bre*_*nt 64 ruby activerecord ruby-on-rails

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

就像是:

Record.find(:all).date.unique.count 
Run Code Online (Sandbox Code Playgroud)

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

Yul*_*ule 107

在rails 4及以上版本中略有改变:distinct => true现已弃用.使用:

Record.distinct.count('date')
Run Code Online (Sandbox Code Playgroud)

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

Record.group(:date).distinct.count(:date)
Run Code Online (Sandbox Code Playgroud)

  • 它对我不起作用.使用`.count('DISTINCT date')` (6认同)
  • 我最终使用`Record.group(:date).count.count`. (5认同)

Nat*_*aum 83

您要的是以下SQL:

SELECT COUNT(DISTINCT date) FROM records
Run Code Online (Sandbox Code Playgroud)

ActiveRecord内置了这个:

Record.count('date', :distinct => true)
Run Code Online (Sandbox Code Playgroud)

  • 现在不推荐使用(rails 4),请参阅下面的答案. (17认同)
  • 是否可以使用多个列作为范围来执行此操作? (2认同)

m10*_*104 16

在SQL之外:

Record.find(:all).group_by(&:date).count
Run Code Online (Sandbox Code Playgroud)

ActiveSupport的Enumerable#group_by是必不可少的.


Yi *_*Xie 13

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

所以我达到了要求

Record.count('DISTINCT date')
Run Code Online (Sandbox Code Playgroud)


leo*_*ers 11

详细说明答案:

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}
Run Code Online (Sandbox Code Playgroud)


Jac*_*lyn 9

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