在 Ruby on Rails 数组中按月排序



我需要一个数组,它给我@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 123

这目前将所有想法添加到一个插槽[]中,并且没有正确排序。 如何更改它以使我的数组看起来像示例?

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

相关内容

  • 没有找到相关文章

最新更新