如何从ActiveSerializer加载嵌套json



我想为JSON导入/导出系统开发方法。

举一个简单的例子,我们有一只有爪子的猫,我做了这个:

class Cat < ApplicationRecord
has_many :paws
def json_export
json = self.to_json(include: :paws)
File.open("some_file_name.txt", "w") { |file| file.puts json }
end
def self.json_import
Cat.new.from_json(File.open("some_file_name.txt", "rb").read)
end
end
# I put Paw code below FYI
class Paw < ApplicationRecord
belongs_to :cat
end

文件中的JSON是:

{"id":1,"name":"Felix","paws":[{"id":1,"color":"red","cat_id":1}]}

但当我运行json_inport时,我得到了错误:

ActiveRecord::AssociationTypeMismatch: Paw(#69870882049060) expected, got {"id"=>1, "color"=>"red", "cat_id"=>1} which is an instance of Hash(#47217074833080)

我在文档中没有找到与我的问题相关的"from_json",我也没有成功找到相关的资源。有没有办法在没有宝石的情况下做到这一点?(如果我需要,我会考虑的(。

您在paws密钥名称上遇到问题,要解决此问题,请使用密钥名称paws_attributes

查看所需的属性密钥名称accepts_nested_attributes_for

你的.txt文件内容应该看起来像这个

{"id":1,"name":"Felix","paws_attributes":[{"id":1,"color":"red","cat_id":1}]}

解决方案:

json = self.to_json({include: :paws, as: :paws_attributes})

并添加如下所述的自定义as_json方法之一。

class Cat < ApplicationRecord
has_many :paws
accepts_nested_attributes_for :paws
def as_json(options = {})
hash = super(options)
hash[options[:as].to_s] = hash.delete(options[:include].to_s) if options.key? :as
hash
end

#OR
#  if want to use custom key names
def as_json(options = {})
json = {id: id, name: name} # whatever info you want to expose
json[options[:as].to_s] = paws.as_json if options[:as]
json
end

...
end

最新更新