Группировать и считать в Rails

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

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

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


person tladuke    schedule 07.01.2010    source источник


Ответы (7)


Вы можете выполнить count для line_items, что вернет вам упорядоченный хэш device_id и count.

@project.line_items.group(:device_id).count
person Chandra Patni    schedule 07.01.2010
comment
Это дает предупреждение: DEPRECATION WARNING: Relation#calculate with finder options is deprecated. Please build a scope and then call calculate on it instead. (called from C:in 'count':) - person Chloe; 24.12.2013
comment
@Chloe - Попробуйте это в Rails 4, чтобы удалить предупреждение: @project.line_items.group(:device_id).count - person Matt Huggins; 08.01.2014

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

@project.line_items.group(:device_id).count
person Sandip Ransing    schedule 25.02.2012

Просто добавьте опцию :select:

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

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

person Alex Reisner    schedule 07.01.2010
comment
хм, я добавил debug(@line_items) в свое представление, но я не вижу никаких счетчиков, поэтому я не думаю, что понимаю вас. Я думаю, что результат точно такой же, как и без опции выбора. - person tladuke; 07.01.2010
comment
Метод отладки не покажет количество, потому что это не атрибут ActiveRecord, но присутствует атрибут количества для каждого объекта. В любом случае решение Чандры намного лучше. - person Alex Reisner; 27.01.2010

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

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

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

person bluefoggy    schedule 12.02.2018

что-то типа

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

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

person rogerdpack    schedule 27.01.2013

Только для подсчета выщипывание здесь будет быстрее, чем группировка.

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


@project.line_items.pluck(:device_id).uniq.count
person John Smith    schedule 07.06.2017
comment
Они вернут совершенно разные результаты для перечисленных атрибутов. Например: customer_subscriptions.group(:status).count вернет: {1 => 6, 2 => 11, 3 => 136, 0 => 30} и customer_subscriptions.pluck(:status).count просто вернет 183 - person msdundar; 16.10.2017
comment
правда, а как же тогда uniq? @project.line_items.pluck(:device_id).uniq.count - person John Smith; 10.11.2017

После этой фиксации:

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

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

@project.line_items.count(:group => LineItem.arel_table[:device_id])
person Psylone    schedule 16.09.2013