Подтвердить что ты не робот

Как подсчитать группу по строкам в рельсах?

Когда я использую User.count(:all, :group => "name"), я получаю несколько строк, но это не то, что я хочу. Я хочу, чтобы подсчет строк. Как я могу получить его?

4b9b3361

Ответ 1

В настоящее время (18.03.2014 - Rails 4.0.3) это правильный синтаксис:

Model.group("field_name").count

Он возвращает хеш с подсчетом как значения например.

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

#=> {
  "pdf_generated" => 56
}

Ответ 2

  • User.count предоставит вам общее количество пользователей и переведёт на следующий SQL: SELECT count(*) AS count_all FROM "users"
  • User.count(:all, :group => 'name') предоставит вам список уникальных имен вместе со своими подсчетами и переводит на этот SQL: SELECT count(*) AS count_all, name AS name FROM "users" GROUP BY name

Я подозреваю, что вы хотите вариант 1 выше, но я не понимаю, что именно вы хотите/нуждаетесь.

Ответ 3

Возможно, вы хотите подсчитать отличное имя пользователя?

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

вернет 3, если у вас есть пользователь с именем John, John, Jane, Joey (например) в базе данных.

 ________
| name   |
|--------|
| John   |
| John   |
| Jane   |
| Joey   |
|________|

Ответ 4

Попробуйте использовать User.find(: all,: group = > "name" ). count

Удачи!

Ответ 5

Я нашел странный способ, который, кажется, работает. Для подсчета строк, возвращаемых из групповых подсчетов.

Пример таблицы пользователя

________
| 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" }
]