2010-10-14 2 views
1

В принципе у меня две цепочки моделей, одна содержит «предсказанные данные», а одна содержит «фактические данные». Я хотел бы скопировать все предсказанные данные в фактические, когда создается фактическое.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) 

Почему я получаю эту ошибку?

+1

http://github.com/DefV/deep_cloning Похоже, он может делать то, что мне нужно. – jvatic

+0

В качестве примечания, если вы просто вызываете один метод в блоке, вы можете написать 'r.runs.collect (&: clone)' вместо 'r.runs.collect {| run | run.clone()} ', где обозначение' &: 'означает, по существу,« вызывать этот метод для каждого объекта ». Вам также не нужно включать пустые скобки в вызовы методов, как вы могли бы на других языках, таких как JavaScript или C. – tadman

+0

Спасибо, я иногда добавляю браки по привычке. Не знал о методе &:, выглядит действительно полезным. – jvatic

ответ

0

Это работает:

def init_data 
    employees = Employee.all 
    employees.each do |e| 
    ed = e.template.effective_dates.first 
    if ed 
     ed.routes.map do |route| 
     route_attrs = route.attributes 
     route_attrs[:effective_date_id] = nil 
     route_attrs[:actual_id] = self.id 
     new_route = Route.new(route_attrs) 

     new_runs = route.runs.map do |run| 
      Run.new(run.attributes) 
     end 

     new_route.runs = new_runs 
     e.routes << new_route 
     e.save 
     end 
    end 
    end 
end 
0

Пытались deep_clonable из GitHub вы? Он должен поддерживать rails3 - однако, он не работает для меня

Смежные вопросы