无法在Ruby中向Array添加修改后的元素

时间:2013-04-04 14:44:01

标签: ruby arrays

我从db中选择了一些事件。 我需要克隆每个元素30次并设置elem.shedule不同的日期(每月当前月-2013-04-01 .. 2013-04-30)。

这是我的代码('shedule'字段是日期):

daily_events = Events.All
repeated_events = []
for event in(daily_events)
  for day in(1..date.end_of_month.day)
    repeat_event = event
    repeat_event.shedule = Date.new(date.year, date.month, day)
    repeated_events << repeat_event
  end
end

但是作为结果我在每个月的最后一个日期(2013-04-30)每个地方都有30次

如何解决?

如果我设置repeated_events+=repeat_event而不是repeated_events << repeat_event 我在EventsController #index中有TypeError 无法将事件转换为数组(Event#to_ary给出NilClass)

我认为这是因为我只克隆了对元素的引用,而不是元素的内容。有什么方法可以解决它?

2 个答案:

答案 0 :(得分:1)

每次通过内部循环,repeat_event都是对同一event个对象的引用。您的数组最终会存储对该单个对象的许多引用,因此当您对repeat_event.shedule进行分配时,它会影响所有引用。

尝试使用dup制作副本,如下所示:

repeat_event = event.dup

答案 1 :(得分:0)

我发现我需要深层复制并使用Marshal模块

所以我的解决方案是

repeat_event = Marshal.load(Marshal.dump(every_day_event))

谢谢大家!