繁体   English   中英

Rails ActiveModel :: Serializers中的JSON API样式侧载

[英]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使得他们生活在子节点linklinked

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

谢谢!

ActiveModel序列化程序可以做到这一点。 问题在于内置的关联方法是限制性的。 相反,您必须手动建立linkslinked部分。

(此答案指的是稳定的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM