рельсы 3 сгруппировать по сумме - PullRequest
13 голосов
/ 30 января 2012

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

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

но, похоже, много кода для стандартов rails, и rails API говорит, что он устарел .

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

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

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

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

Ответы [ 2 ]

15 голосов
/ 30 января 2012

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

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 [action_type_id, activity_types.name] необходим как часть ключа

Activity.joins(:activity_types).group(:activity_types_id, 'activity_types.name').order(:activity_types_id).sum(:occurrences)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...