Rails 6 Deep Dup

#ruby-on-rails #ruby #serialization

#ruby-on-rails #ruby #сериализация

Вопрос:

У меня есть глубоко вложенный объект, и я хотел бы получить версию ‘dup’ с обновленным одним из вложенных свойств.

Допустим, у нас есть Country , City , State , Person .

Country имеет city и state . City имеет persons .

Ниже приведен пример Country , скажем country_sample

 {
  "id"=>16,
  "city"=>
    [{"id"=>22,
      "person"=>
       [{"id"=>11,
         "uuid"=>"20ac322f-5f62-4786-b14b-73e4cc2a9f38",
         "updated_at"=>"2020-11-12T02:59:53.000Z"}]},
     {"id"=>23,
      "person"=>
       [{"id"=>12,
         "uuid"=>"196e8d33-9b2f-4aab-a2eb-1bda645abc31",
         "updated_at"=>"2020-11-12T02:59:53.000Z"}]},
     {"id"=>24,
      "person"=>[]}],
  "state"=>
  [{"id"=>10,
    "given_name"=>"SomeState",
    "updated_at"=>"2020-11-12T02:59:53.000Z"}],
  "other_prop"=>"val"
}

  

Мне нужно (либо работает):

  1. Я хочу добавить нового пользователя в city with id 24 , а затем мне нужна dup версия всего объекта
  2. Я хочу получить dup версию и добавить нового пользователя в city with id 24

Проблема, с которой я сталкиваюсь, заключается в следующем: когда я запускаю dup_country = country_sample.dup , я не получаю вложенные свойства.

Я получаю что-то вроде

 {
  "id"=>nil,
  "city"=>[],
  "state"=>[],
  "other_prop"=>"val"
}
  

Как вы можете видеть, всех вложенных свойств там нет. Я перепробовал кучу других драгоценных камней, которые имеют дело с dup, например ( full_dup , deep_dup , deep_dive ) , но ничего не помогло. Интересно, что может пойти не так?


ОБНОВЛЕНО:

Пока deep_dup работает для примера, размещенного на https://apidock.com/rails/Hash/deep_dup , Я примерил предмет , который у меня был, и он по — прежнему имеет тот же эффект, dup что и .

Комментарии:

1. Какой тип объекта вы пытаетесь создать? Из вашего примера это выглядит как хэш

2. Я попробовал это на основном объекте, а также на его версии JSON. Проверяя с .kind_of? (Hash) помощью, он считывает JSON is hash . Но deep_dup в версии JSON вообще ничего не делает. Он возвращает тот же JSON.

3. Можете ли вы сделать .class с основным объектом?

4. основной объект Country . С другой стороны, версия json, которая проходит через .as_json(:include .. nested properties Hash

Ответ №1:

amoeba gem хорошо работал после нескольких изменений в модели.

 #config on models

# Country
class Country < ApplicationRecord
  ...
  
  amoeba do
    include-_association :city 
    include-_association :state 
  end
  ...
end

# City
class City < ApplicationRecord
  ...
  
  amoeba do
    include-_association :person 
  end
  ...
end

  

country_deep_dupped = country.amoeba_dup чтобы получить deep-dup версию, которая dup также возвращала версию вложенных объектов.