2

我有一个名为 Account 的模型,具有以下关联:

has_many :contracts, :dependent => :destroy
has_many :packages, :dependent => :destroy

accepts_nested_attributes_for :contracts
accepts_nested_attributes_for :packages

在销毁任何 Account 对象之前,我将其保存在带有 to_json 的文件中:

@account.to_json(:include => [:packages, :contracts])

美好的。当我尝试恢复它时会出现问题(在另一个脚本上):

account_data = JSON.parse json
@account = Account.new account_data

这引发了一个异常:

Package(#70193553579560) expected, got Hash(#70193548333800)

为什么会发生这种情况?在这种情况下,Rails 不应该接受哈希吗?

在我执行@account.save 之后,我是否必须从哈希中删除合同和包密钥并插入它们?我正在寻找一种更清洁的方法来处理这个问题:)

4

1 回答 1

0

看看输出@account.to_json(:include => [:packages, :contracts])。它将关联序列化为 JSON,因此您最终会得到以下内容:

{"id":10, packages:[{id:5,description:"Package1"}], contracts:[]}

当您尝试重新加载 JSON 时,它正在尝试执行以下操作:

account.packages = [{id:5,description:"Package1"}]

这不起作用,因为 account.packages 是一个关联,您不能直接使用 Hash 构建它。但是,您可以将 Hash 作为嵌套属性传递:

account.packages_attributes = [{id:5,description:"Package1"}]

packages_attributes是由accepts_nested_attributes_for模型中已有的类方法定义的方法。

这不会很好地与to_json. 但是,ActiveRecord 也有一种from_json方法,旨在很好地播放to_json

于 2016-02-08T20:13:20.553 回答