Rails:恢复用to_json编码的ActiveRecord对象

时间:2012-07-17 18:23:27

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有一个名为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不应该接受哈希吗?

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

1 个答案:

答案 0 :(得分: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直接构建它。但是,您可以将哈希作为嵌套属性传递:

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

packages_attributes是由accepts_nested_attributes_for类方法定义的方法,您已在模型中使用该方法。

to_json不能很好地发挥作用。但是,ActiveRecord还有一个from_json方法,可以很好地与to_json

一起使用