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

Рельсы 3 группы по сумме и сумме

У меня есть следующая модель:

activity_types: id, name

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

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

Я получил следующее решение на основе этого сообщения, которое выглядит нормально:

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")

но это кажется большим количеством кода для стандартов рельсов и API-интерфейсы rails говорит, что он устарел.

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

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

Возвращает хэш с activity_type_id = > вхождениями.

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

4b9b3361

Ответ 1

Если исходный запрос работал, просто попробуйте переписать его с помощью синтаксиса 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")

Ответ 2

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)

incase [activity_type_id, activity_types.name] необходимо как часть ключа

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