RORの特定のフィールドに一意の値を持つレコードの数をカウントするにはどうすればよいですか?
-
09-06-2019 - |
質問
日付フィールドを含むレコード セットがあり、レコード セット内で表される一意の日付の数を確認したいと考えています。
何かのようなもの:
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)
最新の #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 テーブル全体をメモリに取り込むことになります。)