-2

我从 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

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

如何解决?

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

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

4

2 回答 2

1

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

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

repeat_event = event.dup
于 2013-04-04T15:13:05.010 回答
0

我发现我需要深拷贝并使用 Marshal 模块

所以我的解决方案是

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

谢谢大家!

于 2013-04-04T15:29:40.000 回答