首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails ActiveModel中JSON API风格的旁写::序列化器

Rails ActiveModel中JSON API风格的旁写::序列化器
EN

Stack Overflow用户
提问于 2014-05-02 17:53:57
回答 1查看 2.4K关注 0票数 6

我正在尝试使用AM::序列化程序构建一个JSON API风格的API。我遇到了一个副业的问题。

我希望能够构建如下所示的JSON:

代码语言:javascript
复制
{
    "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"
            }
        ]
    }
}

我想出的代码如下:

代码语言:javascript
复制
class PrimarySerializer < ActiveModel::Serializer
  attributes :id, :data

  has_many :secondaries, key: :secondaries, root: :secondaries
  embed :ids, include: true
end

它生成如下所示的JSON:

代码语言:javascript
复制
{
    "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中?

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-13 23:20:49

ActiveModel序列化程序可以做到这一点。问题是,内置的关联方法是限制性的。相反,您必须手动构建links & linked部件。

(这个答案指的是稳定的0.8.1版本的ActiveModel序列化程序)

下面是一个包含完整JSON解决方案https://gist.github.com/mars/97a637560109b8ddfb27的Gist

示例:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23434136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档