2016-04-24 4 views
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); 
    } 
}); 

上記のコードは機能しますが、チャンネルの各ストーリーについてサーバーに新しいリクエストを行いますが、データは既にレスポンスに含まれているため、余分なリクエストは必要ありません。私が物語データをそのまま残しておけば、データの正規化は失敗します。

関連モデルのデータが応答に埋め込まれていることを示す方法はありますか?

答えて

1

あなたのチャンネルシリアライザに埋め込まれた物語を宣言しようとしましたか?

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs: { 
    stories: { embedded: 'always' } 
    }, 

    normalizeArrayResponse(store, primaryModelClass, hash, id, requestType) { 

    ... 
}); 
+0

何か他のものであるべき...私はすぐにあなたのサンプルを試してみましたが、埋め込まれた戦略がうまく機能...このアサーションは、モデルのキー(アレイまたはSingleRecordのための「チャンネル」のここでの「チャンネル」)が空になったときに失敗します – bmeurant

+0

これまで私はそれを見てきましたが、私はあなたの応答を読むまで、常にDS.EmbeddedRecordsMixinの部分を見逃していました。 – tantalum

関連する問題