我有一个名为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后插入它们?我正在寻找一种更清洁的方法来处理这个问题:)
答案 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