2012-01-30 4 views
13

у меня есть следующие модели:рельсов 3 группы по и сумма

activity_types: id, name 

activities: id, id_activity_type, occurrences, date (other fields) 

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

я получил следующее решение based on this post, который, кажется нормально:

Activity.all(:joins => :activity_types, 
      :select => "activity_types.id, activity_types.name, SUM(activities.occurrences) as occurrences", 
      :group => "activity_types.id, activity_types.name", 
      :order => "activity_types.id") 

, но это, кажется, много коды для стандартов рельсов и rails API says it's deprecated.

Я нашел следующее решение, которое много просто:

Activity.sum(:occurrences).group(:activity_type_id) 

который возвращает хэш с activity_type_id => вхождений.

Что мне делать, чтобы получить следующий хэш: activity_type.name => вхождения?

+0

'activity_types: ид, name' здесь activity_type имени будет Uniq? grouping & ordering on activity_types.id - это просто потому, что вы хотели упорядоченный хэш на основе activity_types.id, правильно? –

ответ

15

Если первоначальный запрос работал, то просто попробуйте переписать его с синтаксисом Rails 3:

Activity.joins(:activity_types) 
    .select("activity_types.id, activity_types.name, SUM(activities.occurrences) as occurrences") 
    .group("activity_types.id, activity_types.name") 
    .order("activity_types.id") 
+0

Ну, если я не найду чистого решения (1 или 2 строки кода), я пойду с этим. Но это просто не похоже на рельсы. – dcarneiro

4

Activity.joins(:activity_types).group('activity_types.name').sum(:occurrences)

SELECT SUM(activities.occurrences) AS sum_occurrences, activity_types.name AS activity_types_name FROM activity_types INNER JOIN activity_types ON activity_types.id = activities.activity_types_id GROUP BY activity_types.name 

в случае, если вам нужен упорядоченный хэш, основанный на activity_types.id и предполагая, activity_types_id не является необходимо как часть хэш-ключа.

Activity.joins(:activity_types).group('activity_types.name').order(:activity_types_id).sum(:occurrences) 

упаковывает [activity_type_id, activity_types.name] необходимо как часть ключевого

Activity.joins(:activity_types).group(:activity_types_id, 'activity_types.name').order(:activity_types_id).sum(:occurrences) 
+0

В нем говорится, что activity.id должен появиться в предложении GROUP BY или использоваться в агрегатной функции. Я смог исправить это, добавив предложение select, но тогда ваш ответ аналогичен ответу @maprihora – dcarneiro

+0

, вы хотите сказать, что activity_types_id и activity.id написаны выше, это ошибка typo? –

+0

, обновленный для составного ключа, имеет ключ –

Смежные вопросы