Включить ответ не связанных объектов, который соответствует спецификации JSON API - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь построить API в рельсах, используя Спецификация JSON API

Моя модель User имеет объекты изменений, связанные с ними.Например, пользователь может иметь следующее изменение:

{
  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' }
  }
]

Вопрос : различия - это массив объектов (не записей, онине имеют идентификатора), которые содержат поля с записями.Можно ли отформатировать ответ так, чтобы глубоко вложенные записи (например, теги в моем случае) были ссылками на записи во включенном разделе?

Я хотел бы использовать fast_jsonapi gem

1 Ответ

0 голосов
/ 27 октября 2018

Я не думаю, что вы можете сделать это без нарушения спецификации.

A объект ресурса должен содержать id :

«Объекты ресурса» появляются в документе JSON API для представления ресурсов.

Объект ресурса ДОЛЖЕН содержать по крайней мере следующие члены верхнего уровня:

  • id
  • тип

Спецификация допускает только одно исключение:

Исключение: элемент id не требуется, когда объект ресурса создается на клиенте ипредставляет новый ресурс, который будет создан на сервере.

Поэтому, если у вашего diffs нет идентификатора, вы не сможете смоделировать его как объект ресурса.

Но вам не разрешено включать ресурс, на который не ссылается объект ресурса:

Составные документы требуют «полной связи», что означает, что каждый включенный ресурс ДОЛЖЕН быть идентифицированпо крайней мере, один объект идентификатора ресурса в том же документе.( source )

Существует только одно исключение, которое не относится к обсуждаемому здесь случаю:

Единственное исключение из требования полного связыванияэто когда поля отношений, которые в противном случае содержали бы данные о связи, исключались с помощью разреженных наборов полей.

...