我从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)
我认为这是因为我只克隆了对元素的引用,而不是元素的内容。有什么方法可以解决它?
答案 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))
谢谢大家!