我正在生成要存储在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)
有没有办法自动从序列化对象初始化新子项?真正的问题包括三个子级别。
答案 0 :(得分:2)
我认为您正在寻找nested_attributes http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
#Parent.rb
accepts_nested_attributes_for :children
您必须将json转换为具有名为children_attributes的键(值为相同的子数组)才能启动。
答案 1 :(得分:2)
使用children=
不起作用,因为许多关联的setter需要一个模型实例数组,而不是用于从哈希创建关联记录。
而是使用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))