Групповые записи по месяцам и годам в Rails

Я на Ruby 1.9.2, Rails 3.0.x, и я использую MySQL DB. У меня есть модель сообщений, где каждый день можно отправлять новые сообщения.

У меня есть действие индекса, где я хочу отображать эти сообщения, сгруппированные по месяцам и годам. Это в основном используется для фильтрации сообщений.

Мой запрос выглядит так: -

@active_msgs = Messages.where('expiry > ?', Time.now).order('created_at DESC')

Я использовал функцию group_by в Rails после ссылки на этот пост

Моя группа по запросу: -

@msgs_by_month = @active_msgs.all.group_by {|u| u.created_at.month }

Мне был возвращен хэш, названный @msgs_by_month. Это помогло мне группировать сообщения по месяцам, но мне нужно учесть год , чтобы сформировать уникальный ключ, поскольку это поможет мне дифференцировать, например, с сентября 2011 года по сентябрь 2012 года.

Мой текущий ключ имеет тип Hash [Месяц] (например, Hash [9] = > за сентябрь сентября, я могу отображать все соответствующие значения). Как я могу получить уникальный ключ типа month, year, который я могу легко зацикливать, чтобы отобразить все записи, сгруппированные по месяцам и году создания.

Спасибо

ИЗМЕНИТЬ: -

Я предполагаю, что это один из способов сделать это, использовать created_at.to_date api, если здесь , Я только удивляюсь, как я могу удалить день из created_at.to_date, чтобы получить уникальный месяц и год комбинационный ключ, который мог бы работа с функцией group_by.

Ответ 1

В SQL:

select * from messages group by year(created_at), month(created_at);

В Rails:

Message.all.group_by { |m| m.created_at.beginning_of_month }

Ответ 2

Использовать дату группы.

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

https://github.com/ankane/groupdate

Ответ 3

Message.select("date_trunc('month', created_at) as month").group("month")