【问题标题】:Sorting by month in an array Ruby on Rails在 Ruby on Rails 数组中按月排序
【发布时间】:2015-06-11 20:27:18
【问题描述】:

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

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

【问题讨论】:

  • 不正确是什么意思?你能说明你得到了什么,什么是错的吗?
  • 它给了我 [Idea.all] 没有 12 个插槽,没有分类到 12 个插槽。数据来自 5 月和 6 月,因此应该至少有 2 个空位。
  • @RustamA.Gasanov 您是否看到此(已编辑)数组无法正常工作的任何其他原因?它仍然提供与我上面描述的相同的输出。
  • 请停止更改您的问题。您最初拥有@ideas_by_month = Array.new(12,[])。 @steenslag 然后告诉你应该是Array.new(12) {[]}。他并不是要你在你的问题中做出那个更正。通过这样做,您使他的回答毫无意义(除非读者通读您的编辑)。理解?您应该进行的唯一编辑是澄清,并在适当的情况下明确这是一个编辑(例如,“编辑:数组......”)。

标签: ruby-on-rails arrays ruby multidimensional-array


【解决方案1】:

Array.new(12,[]) 为您提供对同一数组的 12 个引用。 Array.new(12){Array.new} 创建 12 个不同的数组。

【讨论】:

  • 很好,没有尝试操作帖子中描述的数组创建方法
  • 这是答案的一部分,但给了我相同的输出。我已经用当前数组在上面进行了编辑,您是否发现它无法正常工作的任何其他原因?
  • @VirgeAssault p @ideas.group_by{|idea| idea.created_at.month } 的结果是什么?
【解决方案2】:

问题不在于您的 From the Ruby API...

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

请注意,第二个参数使用引用填充数组 同一个对象。因此,仅建议您在以下情况下使用 需要使用本机不可变对象实例化数组,例如 符号、数字,真假。

因此,当您推入任何嵌套数组时,它都引用了内存中的相同空间。这就是为什么似乎每个 id 都被推入每个嵌套数组的原因。

改为使用块声明您的数组:

@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

【讨论】:

  • 在尝试这个之后,它只显示了一个包含所有想法的插槽 [ ],没有单独的插槽。你还发现其他什么地方有问题吗?
  • 循环本身返回一个包含所有循环项的数组。最后你会再次返回@ideas_by_month 吗? (假设它存在于类方法中)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多