我需要一个数组,它给我@idea.id
按@idea.created_at.month
排序
例如:
[[1,2,3], [4,5,6], [7,8,9], [], [], [], [], [], [], [], [], []]
其中 ID 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]
给我 id 1
、2
、3
。
这目前将所有想法添加到一个插槽[]
中,并且没有正确排序。 如何更改它以使我的数组看起来像示例?
Array.new(12,[])
为您提供了对同一数组的 12 个引用。 Array.new(12){Array.new}
创建 12 个不同的数组。
问题不在于您的<<调用,而在于您创建@ideas_by_month数组。从 Ruby API...
Array.new(3, true) #=> [true, true, true]
请注意,第二个参数使用对 同一对象。因此,仅在以下情况下才建议使用: 需要使用本机不可变对象实例化数组,例如 符号,数字,真或假。
因此,当您推送到任何嵌套数组时,它们都引用了内存中的相同空间。这就是为什么似乎每个id都被推入每个嵌套数组的原因。
而是用块声明你的数组:
@ideas_by_month = Array.new(12) { Array.new }
。看起来像这样完全实现为类方法:
想法.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