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)
爲什麼會出現這個錯誤?
http://github.com/DefV/deep_cloning看起來它可以做我以後的事情。 – jvatic 2010-10-14 17:41:25
作爲一個註釋,如果你只是調用一個塊的單一方法,你可以寫'r.runs.collect(&:clone)'而不是'r.runs.collect {| run | run.clone()}''&''符號在本質上意味着「在每個對象上調用此方法」。您也不需要在方法調用中包含空方括號,就像您在JavaScript或C等其他語言中一樣。 – tadman 2010-10-14 17:44:24
謝謝,我有時會因爲習慣而添加腳架。不知道&的方法,看起來非常有用。 – jvatic 2010-10-14 18:04:24