2017-02-21 4 views
1

Я генерирую данные, которые должны храниться в рельсах. Я экспортировал данные как сериализованную строку JSON.Инициализация модели Rails от JSON - как инициализировать дочерние ассоциации?

Как я могу автоматически построить новый объект и его дочерние ассоциации из этой строки? Model.new(json_string) выдает сообщение об ошибке, потому что дети являются хешами и не инициализированы. Единственная опция для прокрутки каждого объекта и инициализации дочерних элементов? Я чувствую, что может быть какая-то магия, о которой я не знаю.

Пример:

Child belongs_to :parent 
Parent has_many :children 

json_string = "{ 
    attribute1:"foo", 
    attribute2:"bar", 
    children: [ 
    {attribute1:"foo"}, 
    {attribute1:"foo"} 
    ]}" 

Parent.new(json_string) 

ActiveRecord::AssociationTypeMismatch: Child(#79652130) expected, got Hash(#69570820) 

Есть ли способ инициализации новых детей из моего сериализованного объекта автоматически? Реальная проблема включает в себя три дочерних уровня.

ответ

2

Использование children= не работает, так как сеттер для a имеет много ассоциаций, ожидает массив экземпляров модели и не предназначен для создания связанных записей из хэша.

Вместо этого используйте nested attributes:

class Parent 
    has_many :children 
    accepts_nested_attributes_for :children 
end 

Это позволит создать детей, передавая атрибуты children_attributes:

json_string = '{ 
    "attribute1":"foo", 
    "attribute2":"bar", 
    "children_attributes": [ 
    { "attribute1":"foo"}, 
    { "attribute1:""foo"} 
    ] 
}' 

Parent.new(JSON.parse(json_string)) 
Смежные вопросы