Вы получаете ошибку, потому что FixNum
(то есть число) помещается в массив, в строке, которая читает @years.push(year)
.
Ваш подход к использованию массивов для начала немного ошибочен; массив идеально подходит для хранения упорядоченного списка элементов. В вашем случае у вас есть сопоставление ключей и значений, которое идеально подходит для хэша.
На первом уровне ключи - это годы, значения - хэши. Хэши второго уровня содержат ключи месяцев и значения массивов записей.
В этом случае типичный вывод вашего кода будет выглядеть примерно так (на основе вашего примера):
{ 2009 => { 8 => [Entry1, Entry2], 9 => [Entry3] }, 2007 => { 10 => [Entry5] }}
Обратите внимание, что порядок лет и месяцев не гарантируется в каком-либо конкретном порядке. Обычно решение состоит в том, чтобы заказывать ключи в любое время, когда вы хотите получить к ним доступ. Теперь код, который будет генерировать такой вывод (в зависимости от вашей компоновки кода, хотя может быть сделан намного rubier ):
@years = {}
@entries.each do |entry|
timeobj = Time.parse(entry.created_at.to_s)
year = timeobj.strftime("%Y").to_i
month = timeobj.strftime("%m").to_i
@years[year] ||= {} # Create a sub-hash unless it already exists
@years[year][month] ||= []
@years[year][month] << entry
end