gpt4 book ai didi

ruby-on-rails - Rails ActiveModel::Serializers 中的 JSON API 样式旁加载

转载 作者:行者123 更新时间:2023-12-04 15:44:16 24 4
gpt4 key购买 nike

我正在尝试构建一个 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这样它们就住在子节点 linklinked ?

上面的代码是对实际代码的抽象,可能无法工作。希望它充分说明了这一点。

谢谢!

最佳答案

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com