web-dev-qa-db-ja.com

Railsの行ごとにグループを数える方法は?

User.count(:all, :group => "name")を使用すると、複数の行が表示されますが、それは私が望むものではありません。私が欲しいのは行の数です。どうすれば入手できますか?

26
user199403

現在 (18.03.2014- Rails 4.0.3)これは正しい構文です:

Model.group("field_name").count

カウントを値として持つハッシュを返します。

SurveyReport.find(30).reports.group("status").count

#=> {
  "pdf_generated" => 56
}
30
  1. _User.count_はユーザーの総数を示し、次のSQLに変換されます:SELECT count(*) AS count_all FROM "users"
  2. User.count(:all, :group => 'name')は、一意の名前のリストとその数を示し、次のSQLに変換されます。SELECT count(*) AS count_all, name AS name FROM "users" GROUP BY name

上記のオプション1が必要だと思いますが、正確に何が必要/必要かはわかりません。

25
hgmnz

おそらく、ユーザーの個別の名前を数えたいですか?

User.count(:name, :distinct => true)

データベースにJohn、John、Jane、Joeyなどの名前のユーザーがいる場合は3を返します。

 ________
| name   |
|--------|
| John   |
| John   |
| Jane   |
| Joey   |
|________|
12
sikachu

User.find(:all、:group => "name")。countを使用してみてください

幸運を!

5
user199659

私はうまくいくように見える奇妙な方法を見つけました。グループ化カウントから返された行をカウントします。

ユーザーテーブルの例

________
| name   |
|--------|
| Bob    |
| Bob    |
| Joe    |
| Susan  |
|________|

グループ内のカウント


User.group(:name).count

# SELECT COUNT(*) AS count_all
# FROM "users"
# GROUP BY "users"."name"

=> {
  "Bob" => 2,
  "Joe" => 1,
  "Susan" => 1
}

グループ内のカウントからの行カウント

User.group(:name).count.count

=> 5

何かハッキー

これは私が遭遇した興味深いものですが、それはすべての行にカウントを追加し、アクティブレコードランドではあまりうまく機能しないため、かなりハッキーです。これをArel/ActiveRecordクエリに取り込むことができたかどうかは覚えていません。

SELECT COUNT(*) OVER() AS count, COUNT(*) AS count_all
FROM "users"
GROUP BY "users"."name"
[
  { count: 3, count_all: 2, name: "Bob" },
  { count: 3, count_all: 1, name: "Joe" },
  { count: 3, count_all: 1, name: "Susan" }
]
0
CTS_AE