从JSON初始化Rails模型 - 如何初始化子关联?

时间:2017-02-21 20:19:20

标签: ruby-on-rails activerecord serialization

我正在生成要存储在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 个答案:

答案 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))