2015-06-11 2 views
0

мне нужен массив, который дает мне @idea.id отсортированный по @idea.created_at.monthСортировки по месяцу в массиве Ruby On Rails

Например:

[[1,2,3], [4,5,6], [7,8,9], [], [], [], [], [], [], [], [], []] 

где идентификаторы 1, 2 и 3 имеют @idea.created_at.month = 1 и так далее через month = 12.

@ideas_by_month = Array.new(12){Array.new} 
@ideas.each do |idea| 
    month = idea.created_at.month 
    @ideas_by_month[month-1] << idea.id 
end 

К примеру, мне нужно @ideas_by_month[0] дать мне Идентификаторы 1, 2, 3.

Это в настоящее время добавляет все идеи в один слот [] и не сортируется правильно. Как я могу изменить его, чтобы мой массив выглядел как пример?

+2

, что вы имеете в виду, что это неправильно? можете ли вы показать, что вы получаете, а что не так? –

+0

Это дает мне [Idea.all] без 12 слотов, не сортируя по 12 слотам. Данные приведены с мая и июня, поэтому должно быть не менее 2 слотов. –

+0

@ RustamA.Gasanov вы видите какую-либо другую причину, что этот (отредактированный) массив не будет работать? Он все еще дает тот же результат, который я описал выше. –

ответ

0

Вопрос не в вашем вызове < <, но в вашем создании массива @ideas_by_month. From the Ruby API ...

Array.new(3, true) #=> [true, true, true] 

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

Таким образом, когда вы нажимаете на любой из вложенных массивов, все это ссылается на одно и то же пространство в памяти. Вот почему кажется, что каждый идентификатор попадает во все вложенные массивы.

Вместо объявить массив с блоком:

@ideas_by_month = Array.new(12) { Array.new } 

... который будет выглядеть полностью реализован как метод класса:

idea.rb

class Idea < ActiveRecord::Base 
    ... 
    def self.ideas_by_month 
    @ideas_by_month = Array.new(12){Array.new} 
    Idea.all.each do |idea| 
     month = idea.created_at.month 
     @ideas_by_month[month-1] << idea.id 
    end 
    return @ideas_by_month 
    end 
    ... 
end 
+0

После этого он показывает только один слот [] со всеми идеями в нем, без отдельных слотов. Вы видите что-нибудь еще, что может быть неправильным? –

+1

Сам цикл возвращает массив всех элементов, прошедших цикл. Вы снова возвращаетесь в @ideas_by_month в конце? (предполагая, что это живет в методе класса) –

3

Array.new(12,[]) дает вам 12 ссылок на один и тот же массив. Array.new(12){Array.new} создает 12 различных массивов.

+0

Хороший улов, не пробовал метод создания массивов, описанный в ops post –

+0

Это часть ответа, но дает мне тот же результат. Я отредактировал выше с текущим массивом, вы видите другую причину, по которой он не будет работать? –

+0

@VirgeAssault, что является результатом 'p @ ideas.group_by {| idea | idea.created_at.month} '? – steenslag

Смежные вопросы