我正在尝试构建一个 JSON API使用 AM::Serializer 的样式 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 Serializers 可以做到这一点。问题是内置的关联方法是限制性的。相反,您必须建立 links
& linked
手动零件。
(这个回答指的是 stable 0.8.1 version of ActiveModel Serializers )
这是一个包含完整 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
关于ruby-on-rails - Rails ActiveModel::Serializers 中的 JSON API 样式旁加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434136/