В принципе у меня две цепочки моделей, одна содержит «предсказанные данные», а одна содержит «фактические данные». Я хотел бы скопировать все предсказанные данные в фактические, когда создается фактическое.Rails 3 Clone ActiveRecord Модель с субмоделями
def init_data
employees = Employee.all
employees.each do |e|
t = e.template
ed = t.effective_dates.first
if ed and !e.routes
routes = ed.routes.collect do |r|
runs = r.runs.collect { |run| run.clone() }
r.route_type.runs.map do |run|
runs.push run.clone()
end
route = r.clone()
route.effective_date_id = nil
route.actual_id = self.id
route.employee_id = e.id
route.runs = runs
route.save
end
end
e.save
end
self.save
end
Этот код не работает, есть идеи? Я пытаюсь скопировать каждый маршрут и все его прогоны из данного EffectiveDate в его родительский экземпляр Employee.
Update:
ree-1.8.7-2010.02 > employees.each do |e|
ree-1.8.7-2010.02 > routes = e.template.effective_dates.first.routes.map do |route|
ree-1.8.7-2010.02 > new_route = route.clone
ree-1.8.7-2010.02 ?> new_route.runs << route.runs.map(&:clone)
ree-1.8.7-2010.02 ?> new_route
ree-1.8.7-2010.02 ?> end
ree-1.8.7-2010.02 ?> e.routes = routes
ree-1.8.7-2010.02 ?> e.save
ree-1.8.7-2010.02 ?> end
ActiveRecord::AssociationTypeMismatch: Route(#2176300240) expected, got Route(#2177787760)
Почему я получаю эту ошибку?
http://github.com/DefV/deep_cloning Похоже, он может делать то, что мне нужно. – jvatic
В качестве примечания, если вы просто вызываете один метод в блоке, вы можете написать 'r.runs.collect (&: clone)' вместо 'r.runs.collect {| run | run.clone()} ', где обозначение' &: 'означает, по существу,« вызывать этот метод для каждого объекта ». Вам также не нужно включать пустые скобки в вызовы методов, как вы могли бы на других языках, таких как JavaScript или C. – tadman
Спасибо, я иногда добавляю браки по привычке. Не знал о методе &:, выглядит действительно полезным. – jvatic