[英]JSON API style sideloading in Rails ActiveModel::Serializers
我正在尝试使用AM :: Serializer构建JSON API样式的API。 我遇到了侧载问题。
我希望能够构建如下所示的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"
}
]
}
有没有办法覆盖的元件中的位置, secondaries
和侧载secondaries
使得他们生活在子节点link
和linked
?
上面的代码是实际代码的抽象,可能无法正常工作。 希望它能充分说明这一点。
谢谢!
ActiveModel序列化程序可以做到这一点。 问题在于内置的关联方法是限制性的。 相反,您必须手动建立links
和linked
部分。
(此答案指的是稳定的ActiveModel Serializers 0.8.1版本 )
这是具有完整JSON-API解决方案的Gist 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.