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