2010-10-14 92 views
1

基本上我有兩個模型鏈,一個持有'預測數據',一個持有'實際數據'。我想在創建實際時將所有預測數據複製到實際值。Rails 3克隆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中的每個Route及其所有運行拷貝到它的父Employee實例中。

更新:

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 2010-10-14 17:41:25

+0

作爲一個註釋,如果你只是調用一個塊的單一方法,你可以寫'r.runs.collect(&:clone)'而不是'r.runs.collect {| run | run.clone()}''&''符號在本質上意味着「在每個對象上調用此方法」。您也不需要在方法調用中包含空方括號,就像您在JavaScript或C等其他語言中一樣。 – tadman 2010-10-14 17:44:24

+0

謝謝,我有時會因爲習慣而添加腳架。不知道&的方法,看起來非常有用。 – jvatic 2010-10-14 18:04:24

回答

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

你試過從GitHub deep_clonable?它應該支持rails3 - 但是,它不適合我