#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"
}
Мне нужно (либо работает):
- Я хочу добавить нового пользователя в
city
withid
24
, а затем мне нужнаdup
версия всего объекта - Я хочу получить
dup
версию и добавить нового пользователя вcity
withid
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 ishash
. Но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
также возвращала версию вложенных объектов.