Rails 3 Clone ActiveRecord Модель с подмоделями - PullRequest
1 голос
/ 14 октября 2010

По сути, у меня есть две цепочки моделей: одна содержит «прогнозируемые данные», а другая - «фактические данные».Я хотел бы скопировать все прогнозируемые данные в фактические при создании фактических данных.

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.

Обновление:

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)

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

Ответы [ 2 ]

0 голосов
/ 21 октября 2010

Вы пробовали deep_clonable от github? Предполагается, что он поддерживает rails3 - однако он не работает для меня

0 голосов
/ 15 октября 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...