Рельсы 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 = > вхождения?
Ответы
Ответ 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)