我正在尝试使用AM::序列化程序构建一个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中?
以上代码是实际代码的抽象,可能无法工作。希望它能充分说明这一点。
谢谢!
发布于 2014-08-13 23:20:49
ActiveModel序列化程序可以做到这一点。问题是,内置的关联方法是限制性的。相反,您必须手动构建links & linked部件。
(这个答案指的是稳定的0.8.1版本的ActiveModel序列化程序)
下面是一个包含完整JSON解决方案https://gist.github.com/mars/97a637560109b8ddfb27的Gist
示例:
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
endhttps://stackoverflow.com/questions/23434136
复制相似问题