2016-12-02 7 views
1

Конечная точка API, с которой я работаю, возвращает данные с несколькими вложенными отношениями внутри нее, и я использую normalizeResponse() в пределах DS.JSONAPISerializer, чтобы массировать ее в нечто полностью совместимое с JSON-API.normalizeResponse не распознает связь между вложенными отношениями

Инспектор эмбера показывает, что все данные правильно помещаются в соответствующий контейнер. Связь между моделью верхнего уровня и дочерним элементом hasMany работает, но связь между вложенными моделями не работает. Я проверяю это, перемещаясь внутри инспектора на дочернюю модель вложенной модели, нажимая на нее и отмечая, что его свойство content равно null.

Во-первых, обратите внимание на то, как мои модели созданы:

// models/search.js 
// i am able to browse from the search model to children with success 
export default DS.Model.extend({ 
    articles: DS.hasMany('article'), 
}); 

// models/article.js 
// i CANNOT browse from an article down to its digest in ember inspector 
export default DS.Model.extend({ 
    search: DS.belongsTo('search'), 
    type: DS.attr(), 
    created: DS.attr(), 
    updated: DS.attr(), 
    digest: DS.belongsTo('digest'), 
}); 

// models/digest.js 
export default DS.Model.extend({ 
    title: DS.attr(), 
    desc: DS.attr(), 
    date: DS.attr(), 
    article: DS.belongsTo('article'), 
}); 

Теперь, вот мой модифицированную JSON после моих функций внутри normalizeResponse полной. ПОСЛЕ возврата этих данных из normalizeResponse, объект «дайджест» под родительским объектом «отношения» исчезает. Что-то не так с моим JSON? Я пробовал так много перестановок этого без успеха, и я уверен, что это соответствует спецификации JSON-API для Compound Documents.

{"data":{ 
    "type":"searches", 
    "id":"17482738723", 
    "attributes":{ 

    }, 
    "relationships":{ 
    "articles":{ 
     "data":[ 
     { 
      "type":"articles", 
      "id":"19988" 
     }, 
     { 
      "type":"articles", 
      "id":"19989" 
     }, 
     ] 
    }, 
    "digest":{ 
     "data":[ 
     { 
      "type":"digest", 
      "id":"19988_digest" 
     }, 
     { 
      "type":"digest", 
      "id":"19989_digest" 
     }, 
     ] 
    } 
    } 
}, 
"included":[ 
    { 
    "id":"19988", 
    "type":"articles", 
    "attributes":{ 
     "type": "internal", 
     "created":"2016-09-27T00:13:11.000Z", 
     "updated":"2016-09-27T00:13:11.000Z", 
    } 
    }, 
    { 
    "id":"19988_digest", 
    "type":"digest", 
    "attributes":{ 
     "title":null, 
     "desc":"four five six", 
    } 
    }, 
    { 
    "id":"19989", 
    "type":"articles", 
    "attributes":{ 
     "type": "internal", 
     "created":"2016-09-27T00:13:11.000Z", 
     "updated":"2016-09-27T00:13:11.000Z", 
    } 
    }, 
    { 
    "id":"19989_digest", 
    "type":"digest", 
    "attributes":{ 
     "title":"one two three", 
     "desc":null, 
    } 
    }, 
] 
} 

ответ

1

Ваш ответ указывает на следующую модель отношений:

// models/search.js 
export default DS.Model.extend({ 
    articles: DS.hasMany('article'), 
    dignists: DS.hasMany('digest'), 
}); 

// models/article.js 
export default DS.Model.extend({ 
    search: DS.belongsTo('search'), 
}); 

// models/digest.js 
export default DS.Model.extend({ 
    search: DS.belongsTo('search'), 
}); 

Таким образом, вы должны исправить свой ответ:

  • удалить digest отношения на search
  • добавить digest отношения на каждые article

Таким образом, вы закончите с чем-то вроде этого:

{ 
    "data":{ 
    "type":"searches", 
    "id":"17482738723", 
    "attributes":{ 
    }, 
    "relationships":{ 
     "articles":{ 
     "data":[ 
      { 
      "type":"articles", 
      "id":"19988" 
      }, 
      { 
      "type":"articles", 
      "id":"19989" 
      }, 
     ] 
     } 
    } 
    }, 
    "included":[ 
    { 
     "id":"19988", 
     "type":"articles", 
     "attributes":{ 
     "type": "internal", 
     "created":"2016-09-27T00:13:11.000Z", 
     "updated":"2016-09-27T00:13:11.000Z", 
     }, 
     "relationships":{ 
     "digest": { 
      "data": { 
      "type":"digest", 
      "id":"19988_digest" 
      } 
     } 
     } 
    }, 
    { 
     "id":"19988_digest", 
     "type":"digest", 
     "attributes":{ 
     "title":null, 
     "desc":"four five six", 
     }, 
     "relationships":{ 
     "digest":{ 
      "data": { 
      "type":"digest", 
      "id":"19989_digest" 
      } 
     } 
     } 
    }, 
    { 
     "id":"19989", 
     "type":"articles", 
     "attributes":{ 
     "type": "internal", 
     "created":"2016-09-27T00:13:11.000Z", 
     "updated":"2016-09-27T00:13:11.000Z", 
     } 
    }, 
    { 
     "id":"19989_digest", 
     "type":"digest", 
     "attributes":{ 
     "title":"one two three", 
     "desc":null, 
     } 
    }, 
    ] 
} 

Знайте, что вы можете сделать это наоборот и указать article на digest. ember-data автоматически сохранит все в синхронизации. Я лично предпочитаю уточнить обе стороны отношений для ясности.

 Смежные вопросы

  • Нет связанных вопросов^_^