RORの特定のフィールドに一意の値を持つレコードの数をカウントするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/36608

質問

日付フィールドを含むレコード セットがあり、レコード セット内で表される一意の日付の数を確認したいと考えています。

何かのようなもの:

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

しかしもちろん、それはうまくいかないようです。

役に立ちましたか?

解決

ここで求めているのは次の SQL です。

SELECT COUNT(DISTINCT date) FROM records

ActiveRecord には次の機能が組み込まれています。

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

他のヒント

これは、Rails 4 以降では少し変更されました。 :distinct => true 現在は非推奨になっています。使用:

Record.distinct.count('date')

または、日付と番号が必要な場合は、次のようにします。

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

SQL 以外の場合:

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

アクティブサポートの 列挙可能#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 ...

また、データベース内のフィールドにインデックスがあることを確認してください。そうでないと、クエリがすぐに遅くなります。

(SQL でこれを行う方がはるかに優れています。そうでない場合は、カウントを返すためだけに db テーブル全体をメモリに取り込むことになります。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top