ActiveModelSerializer не сериализует вложенные дочерние объекты - PullRequest
0 голосов
/ 10 мая 2019

У меня есть категория модели, в которой используется 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 ]

1 голос
/ 10 мая 2019

Если вы хотите глубокое вложение по умолчанию , тогда вы можете установить следующее свойство конфигурации в файле инициализатора

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

Для более подробной информации, вы можете проверить это .

Вы также можете добавить еще один сериализатор для детей, как следует

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

Для получения дополнительной информации, вы можете обратиться к этой ссылке

0 голосов
/ 10 мая 2019

Как насчет этого решения с использованием сериализатора для детей? Будьте осторожны, чтобы не попасть в бесконечный цикл с глубокими вложениями

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