ActiveModelSerializer不能序列化对象嵌套的子级

时间:2019-05-10 07:18:35

标签: ruby-on-rails ruby jsonserializer

我有一个使用awesome_nested_set gem的模型类别,因此它具有模型本身的子代。我已经为模型创建了CategorySerializer

class CategorySerializer < ActiveModel::Serializer
  attributes :id, :parent_id, :lft, :rgt, :text, :permalink, :children

  def children
    object.children
  end
end

但是子级没有序列化。我也尝试添加has_many :children, serializer: self,结果是这样

{
        "id": 25918,
        "parent_id": null,
        "lft": 3,
        "rgt": 8,
        "text": "ARAG",
        "permalink": "25918-arag",
        "children": [
            {
                "id": 25919,
                "parent_id": 25918,
                "lft": 4,
                "rgt": 7,
                "text": "Coperchi",
                "permalink": "25919-coperchi",
                "children": [
                    {
                        "id": 25920,
                        "parent_id": 25919,
                        "lft": 5,
                        "rgt": 6,
                        "text": "Ribaltabili",
                        "description": "",
                        "page_title": "",
                        "meta_key": "",
                        "meta_description": "",
                        "key_1": null,
                        "key_2": null,
                        "key_3": null,
                        "extra": null,
                        "created_at": "2019-03-01T21:08:15.000+01:00",
                        "updated_at": "2019-04-02T12:27:05.000+02:00"
                    }
                ]
            }
        ]
    }

第二级子级已成功序列化,但第二级未成功。有没有办法或方法来序列化所有对象子对象?

2 个答案:

答案 0 :(得分:0)

在孩子身上调用序列化程序的解决方案如何?注意不要陷入深度嵌套的无限循环

def children
  object.children.map { |obj| SomeSerializer.new(obj) }
end

答案 1 :(得分:0)

如果您要默认情况下进行深度嵌套,则可以在初始化程序文件中设置以下config属性

# config/initializers/active_model_serializer.rb    
ActiveModelSerializers.config.default_includes = '**

有关更多详细信息,您可以选中this

您还可以按照以下步骤为孩子添加另一个序列化器

class CategorySerializer < ActiveModel::Serializer
  attributes :id, :parent_id, :lft, :rgt, :text, :permalink, :children

  def children
    ActiveModel::SerializableResource.new(object.children,  each_serializer: ChildrenSerializer)
  end
end

有关更多信息,您可以参考此link