EmberJS JSONAPIAdapter с hasMany + встроенными отношениями

В дополнение к моему последнему вопросу ember.js JSONAPIAdapter with hasMany коллега спросил, " Загруженные неопубликованными отношения в рабочей структуре JSON:API могут быть встроены следующим образом:

{
    "data": [
      {
        "type": "altersgruppe",
        "id": "1",
        "attributes": {
          "name": "UNTER_21"
        },
        "relationships": {
          "tarifbeitraege": {
            "data": [
              {
                "type": "tarifbeitrag",
                "id": "3",
                "attributes": {
                  "name": "ZAHN70",
                  "beitrag": "3-29,70",
                  "proergaenzung": "7,00",
                  "gesamtbeitrag": "25.99"
                }
              },
              {
                "type": "tarifbeitrag",
                "id": "4",
                "attributes": {
                  "name": "ZAHN90",
                  "beitrag": "4-28,70",
                  "proergaenzung": "7,00",
                  "gesamtbeitrag": "30.99"
                }
              }
            ]
          }
        }
      },
      {
        "type": "altersgruppe",
        "id": "2",
        "attributes": {
          "name": "ALTER_21_24"
        },
        "relationships":{
          "tarifbeitraege": {
            "data": [
              {
                "type": "tarifbeitrag",
                "id": "1",
                "attributes": {
                  "name": "ZAHN70",
                  "beitrag": "1-25,70",
                  "proergaenzung": "7,00",
                  "gesamtbeitrag": "25.99"
                }
              },
              {
                "type": "tarifbeitrag",
                "id": "2",
                "attributes": {
                  "name": "ZAHN90",
                  "beitrag": "2-25,70",
                  "proergaenzung": "7,00",
                  "gesamtbeitrag": "25.99"
                }
              }]
          }
        }
      }
    ]
}

Идея, стоящая за этим: мы можем использовать отношения с меньшими проблемами в бэкэнде Java (где загруженные структуры труднее реализовать).

Но приведенная выше структура JSON не работает. Хранилище содержит только первый уровень данных, то есть "altersgruppe", но "tarifbeitraege" пуст.


person Ste.    schedule 10.07.2015    source источник


Ответы (1)


Этот тип документа называется составным документом в спецификации JSON:API.

Раздел «отношения» составного документа должен содержать только отношения — отдельные объекты должны быть объекты идентификатора ресурса. Размещение атрибутов там не работает, потому что они не должны быть там.

Вместо этого полные объекты загружаются в раздел «включено» верхнего уровня. Таким образом, ваш ответ, вероятно, должен выглядеть примерно так:

{
    "data": [
      {
        "type": "altersgruppe",
        "id": "1",
        "attributes": {
          "name": "UNTER_21"
        },
        "relationships": {
          "tarifbeitraege": {
            "data": [
              { "type": "tarifbeitrag", "id": "3" },
              { "type": "tarifbeitrag", "id": "4" }
            ]
          }
        }
      },
      {
        "type": "altersgruppe",
        "id": "2",
        "attributes": {
          "name": "ALTER_21_24"
        },
        "relationships":{
          "tarifbeitraege": {
            "data": [
              { "type": "tarifbeitrag", "id": "1" },
              { "type": "tarifbeitrag", "id": "2" }
              ]
           }
        }
      }
    ],
    "included": [
      {
        "type": "tarifbeitrag",
        "id": "3",
        "attributes": {
          "name": "ZAHN70",
          "beitrag": "3-29,70",
          "proergaenzung": "7,00",
          "gesamtbeitrag": "25.99"
        }
      },
      {
        "type": "tarifbeitrag",
        "id": "4",
        "attributes": {
          "name": "ZAHN90",
          "beitrag": "4-28,70",
          "proergaenzung": "7,00",
          "gesamtbeitrag": "30.99"
        }
      },
      {
        "type": "tarifbeitrag",
        "id": "1",
        "attributes": {
          "name": "ZAHN70",
          "beitrag": "1-25,70",
          "proergaenzung": "7,00",
          "gesamtbeitrag": "25.99"
        }
      },
      {
        "type": "tarifbeitrag",
        "id": "2",
        "attributes": {
          "name": "ZAHN90",
          "beitrag": "2-25,70",
          "proergaenzung": "7,00",
          "gesamtbeitrag": "25.99"
        }
      }
    ]
}

На главной странице http://jsonapi.org есть пример, который также включает боковую загрузку как в разделе спецификации, описывающем составные документы.

person Kevin Hunter    schedule 08.08.2015