Demigodd
@Demigodd

Как правильно копировать обьект в этом случае?

Тип обьекта для копирования
obj = {
id: 1
models: [
    {
      id: 1,
      parent_id: nil
    },
    {
      id: 2,
      parent_id: 1
    },
    {
      id: 3,
      parent_id: 1
    },
    {
      id: 4,
      parent_id: nil
    },
    {
      id: 5,
      parent_id: 4
    },
    {
      id: 6,
      parent_id: 4
    }
  ]
}


Существует обьект такого типа.
praent_id это идентификатор того же моделя у которых оно nil.
При его копирования с помощью метода dup
new_obj = obj.dup
new_obj.save!

obj.models.each do |m|
  new_obj.models << m.dup
end


После копирования parent_id остаеться прежним.

Правильный результат
Дата перед копированием.
[
 {
   id: 123,
   parent_id: nil
 },
 {
   id: 456,
   parent_id: 123
 }
]


и после копирования
[
 {
   id: 457,
   parent_id: nil
 },
 {
   id: 458,
   parent_id: 123
 }
]


Правильный результат, должен быть.
[
 {
   id: 457,
   parent_id: nil
 },
 {
   id: 458,
   parent_id: 457
 }
]


Как в этом случае правильно распределить parent_id для моделей ?
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
Если я верно понял логику копирования parent_id:
new_obj = {id: new_id, models: []}
prev_model = nil
obj[:models].each do |m|
  new_model = m.dup
  new_model[:parent_id] = prev_model[:id] unless prev_model.nil?
  new_obj[:models] << new_model
  prev_model = new_model
end

 результат
{:id=>2,
:models=>
[{:id=>1, :parent_id=>nil},
{:id=>2, :parent_id=>1},
{:id=>3, :parent_id=>2},
{:id=>4, :parent_id=>3},
{:id=>5, :parent_id=>4},
{:id=>6, :parent_id=>5}]}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы