0
チャンネルを返す単純なAPIがあり、各チャンネルにはいくつかのストーリーが含まれています。 APIは、チャネルのために、以下の構造体を返します。埋め込みhasMay関係を持つEmberJS RESTSerializer
{
"id": 1,
"name": "The Awesome Channel",
"stories": [
{
"icon": null,
"id": 3,
"pub_date": "2015-08-08T17:32:00.000Z",
"title": "First Cool Story"
},
{
"icon": null,
"id": 4,
"pub_date": "2015-10-20T12:24:00.000Z",
"title": "Another Cool Story"
}
]
}
私は、定義された2つの次のモデルを持っているchannel.js
:
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
bgurl: DS.attr('string'),
stories: DS.hasMany('story')
});
とstory.js
:
import DS from 'ember-data';
export default DS.Model.extend({
channelId: DS.attr('number'),
title: DS.attr('string'),
pubDate: DS.attr('string'),
icon: DS.attr('string'),
});
私もこのRESTSerializerを持っていますチャネルを逆シリアル化する:
import DS from 'ember-data';
export default DS.RESTSerializer.extend({
normalizeArrayResponse(store, primaryModelClass, hash, id, requestType) {
var newHash = {
channels: hash
};
return this._super(store, primaryModelClass, newHash, id, requestType);
},
normalizeSingleResponse(store, primaryModelClass, hash, id, requestType) {
// Convert embedded data into a lost of story ids
var stories = hash.stories.map(function(story) {
return story.id;
});
delete hash.stories;
hash.stories = stories;
var newHash = {
channel: hash,
};
return this._super(store, primaryModelClass, newHash, id, requestType);
}
});
上記のコードは機能しますが、チャンネルの各ストーリーについてサーバーに新しいリクエストを行いますが、データは既にレスポンスに含まれているため、余分なリクエストは必要ありません。私が物語データをそのまま残しておけば、データの正規化は失敗します。
関連モデルのデータが応答に埋め込まれていることを示す方法はありますか?
何か他のものであるべき...私はすぐにあなたのサンプルを試してみましたが、埋め込まれた戦略がうまく機能...このアサーションは、モデルのキー(アレイまたはSingleRecordのための「チャンネル」のここでの「チャンネル」)が空になったときに失敗します – bmeurant
これまで私はそれを見てきましたが、私はあなたの応答を読むまで、常にDS.EmbeddedRecordsMixinの部分を見逃していました。 – tantalum