包括符合JSON API规范的非关联对象响应

时间:2018-10-25 12:25:20

标签: rails-api json-api fastjsonapi

我正在尝试使用JSON API specification

在Rails中构建API

我的用户模型具有与之关联的更改对象。例如,用户可以进行以下更改:

{
  id: 10,
  type: 'changes',
  diffs: [
    {
      subject: 'email',
      from: 'old@example.org',
      to: 'new@example.org'
    },
    {
      subject: 'tags',
      from: []
      to: [{ id: 1, type: 'tags', label: 'Ruby' }]
    }
  ]
}

如您所见,diffs属性包含一组变更差异,第二个差异是一组对象差异。我想修改此格式(如果可能),使其符合JSON API规范。像这样:

{
  subject: 'tags',
  from: []
  to: [{ id: 1, type: 'tags' }]
}

并将标签的属性放入包含的部分:

included: [
  {
    id: 1,
    type: 'tags',
    attributes: { label: 'Ruby' }
  }
]

问题:差异是一组对象(不是记录,它们没有ID),其中包含带有记录的字段。是否可以格式化响应,以便深度嵌套的记录(例如本例中的标签)将引用包含部分中的记录?

我想使用fast_jsonapi gem

1 个答案:

答案 0 :(得分:1)

我认为您可以在不违反规范的情况下做到这一点。

resource object必须包含一个 id

  

“资源对象”出现在JSON API文档中以表示资源。

     

资源对象必须至少包含以下顶级成员:

     
      
  • id
  •   
  • 类型
  •   

规范仅允许一个例外:

  

例外:当资源对象起源于客户端并代表要在服务器上创建的新资源时,不需要id成员。

因此,如果您的diffs没有ID,则无法将其建模为资源对象。

但是不允许您包含资源对象未引用的资源:

  

复合文档需要“完全链接”,这意味着每个包含的资源必须由同一文档中的至少一个资源标识符对象标识。 (source

只有一种例外情况不适用于此处讨论的情况:

  

完全链接要求的唯一例外是通过稀疏字段集排除了原本包含链接数据的关系字段。