Группировать и считать в Rails - PullRequest
50 голосов
/ 07 января 2010

Я знаю, что видел это раньше, но сейчас ничего не могу найти. Я хочу сгруппировать запрос по определенному столбцу и иметь возможность отображать, сколько их в каждой группе. Я получил первую часть вниз:

@line_items = @project.line_items.all(:group => "device_id")  

Это для моего представления индекса позиции, которое представляет собой просто таблицу, отображающую позиции. Как сделать столбец в этой таблице для «количества» теперь, когда позиции сгруппированы по устройству?

Ответы [ 7 ]

102 голосов
/ 07 января 2010

Вы можете сделать count на line_items, который вернет вам заказанный хеш device_id и count.

@project.line_items.group(:device_id).count
10 голосов
/ 25 февраля 2012

хэш devise_id в качестве ключа и количество связанных записей

@project.line_items.group(:devise_id).count
8 голосов
/ 07 января 2010

Просто добавьте :select параметр:

@line_items = @project.line_items.all(
  :group  => "device_id",
  :select => "device_id, COUNT(*) as count"
)

Тогда каждый @line_item будет иметь атрибут count.

4 голосов
/ 12 февраля 2018

Думаю, вы тоже можете попробовать это.

@project.line_items.group(:device_id).pluck("device_id, count(device_id)")

^^ Это дает массив массивов с элементами 'device_id and count'

3 голосов
/ 27 января 2013

что-то вроде

 User.all(:joins => :comments, :select => "users.*, count(comments.id) as comments_count", :group => "users.id")

может также работать ...

2 голосов
/ 07 июня 2017

Только для подсчета pluck будет здесь быстрее, чем группа

@project.line_items.pluck(:device_id).count


@project.line_items.pluck(:device_id).uniq.count
0 голосов
/ 16 сентября 2013

После этого коммита:

https://github.com/rails/rails/commit/a1c05dd8b9bd3623289d3aa73dda2943d620cc34

есть новый способ сделать то же самое:

@project.line_items.count(:group => LineItem.arel_table[:device_id])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...