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

标签 ruby-on-rails json ruby-on-rails-4 serialization

我正在尝试构建一个 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/

相关文章:

ruby-on-rails - 客户端取消订阅 channel

ruby-on-rails - Ruby 发送到方法哈希

javascript - 从数组中的 JSON 对象中查找最大值并将其合并

ruby-on-rails - Rails/Ruby 相当于 PHP file_get_contents

ruby-on-rails - Rails 验证 Has Many 关系至少有 1 个条目

ruby-on-rails - 登录 Postgresql 时角色不存在错误

ruby-on-rails - Rails 4 .order() 被 JOINS 破坏

java - Gson 从共享首选项中读取数据

json - 如何将授权 header 从 SQL Server 传递到 API 以获取 JSON?

ruby-on-rails-4 - Google Recaptcha v2 无法与生产中的 Rails 应用程序配合使用