JSON API style sideloading в Rails ActiveModel:: сериализаторы

Я пытаюсь построить JSON API стиль API с помощью Am:: сериализатор. У меня проблема с загрузкой.

Я хочу иметь возможность создавать JSON, который выглядит так:

{
    "primaries": [{
        "id": 123,
        "data": "Hello world.",
        "links": {
            "secondaries": [ 1, 2, 3 ]
        }
    }],
    "linked" : {
        "secondaries": [
            {
                "id": 1,
                "data": "test1"
            },
            {
                "id": 2,
                "data": "test2"
            },
            {
                "id": 3,
                "data": "test3"
            }
        ]
    }
}

код, который я смог придумать, выглядит так:

class PrimarySerializer < ActiveModel::Serializer
  attributes :id, :data

  has_many :secondaries, key: :secondaries, root: :secondaries
  embed :ids, include: true
end

, который генерирует JSON, который выглядит так:

{
    "primaries": [{
        "id": 123,
        "data": "Hello world.",
        "secondaries": [ 1, 2, 3 ]
    }],
    "secondaries": [
        {
            "id": 1,
            "data": "test1"
        },
        {
            "id": 2,
            "data": "test2"
        },
        {
            "id": 3,
            "data": "test3"
        }
    ]
}

есть ли способ переопределить местоположение in-element secondaries и в стороне secondaries такие, что они живут в ребенке узлы link и linked?

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

спасибо!

1 ответов


сериализаторы ActiveModel могут это сделать. Проблема в том, что встроенные методы ассоциации являются ограничительными. Вместо этого вы должны создать links & linked запасные части вручную.

(этот ответ относится к стабильная 0.8.1 версия сериализаторов ActiveModel)

вот суть с полным решением JSON-API https://gist.github.com/mars/97a637560109b8ddfb27

пример:

class ExampleSerializer < JsonApiSerializer # see Gist for superclass
  attributes :id, :name, :links

  def links
    {
      things: object.things.map(&:id),
      whatzits: object.whatzits.map(&:id)
    }
  end

  def as_json(*args)
    hash = super(*args)

    hash[:linked] = {
      things: ActiveModel::ArraySerializer.new(
          object.things,
          each_serializer: ThingsSerializer
        ).as_json,
      whatzits: ActiveModel::ArraySerializer.new(
          object.whatzits,
          each_serializer: WhatzitsSerializer
        ).as_json
    }

    hash
  end

end