2

カスタム サーバー PHP API に沿って Ember RC6 と Ember-Data v0.13-54 を使用してアプリを操作すると、モデルの関係 (主に多対多) とサイド ローディングでいくつかの問題が発生します。

問題のモデルは次のとおりです。

App.Member = DS.Model.extend({
  apiToken: DS.attr('string'),
  apiTokenExpire: DS.attr('string'),
  favourites: DS.hasMany('App.Presentation')
});

App.Presentation = DS.Model.extend(
{
  title: DS.attr('string'),
  description: DS.attr('string'),
  date: DS.attr('date'),

  category: DS.belongsTo('App.Category'),
  tags: DS.hasMany('App.Tag'),
  employees: DS.hasMany('App.Member'),

  presentation: DS.belongsTo('App.File'),
  presenterNotes: DS.belongsTo('App.File'),
  cover: DS.belongsTo('App.Image')
});

私が持っているモデルとの関係を送信するために RESTAdapater を取得するMemberには:

App.APIRESTAdapter.map('App.Member', {
  favourites: {embedded: 'always'}
});

サーバーをロード/members/1すると、次のように返されます。

{
  "member": {
    "api_token": "9fa236ad58726584d7b61bcf94b4dda37cbd3a24",
    "api_token_expire": "1383832335",
    "id": 1,
    "favourite_ids": [ 3 ],
    "group_ids": [ 2 ]
  },
  "presentations": [
    {
      "title": "That's a new one!",
      "category_id": 2,
      "id": 3,
      "tag_ids": [ 1 ],
      "employee_ids": [ 1 ]
    }
  ]
}

しかし、ログget('member.favourites').mapProperty('id')に記録すると、空の配列が取得され、実際にはモデルfavouritesに追加されません。Member

favouritesRESTAdapterへの埋め込みを無効にすると、すべて正常に動作します。何か足りないものがあるのでしょうか、それとも JSON 応答のフォーマットに問題があるのでしょうか?


編集:

掘り下げてみると、データをサイドロードするときに使用されるリレーション名 ( favoritesemployees ) がモデル名 ( MemberPresentation ) とは異なるという事実に問題があるようです。奇妙なことに、rev。12 https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.mdモデルはタイプごとにサイドロードする必要があります。

いくつかのテストを行って、これら 2 つのモデルに新しい多対多の関係を追加しました。

App.Member取得presentations: DS.hasMany('App.Presentation')

App.Presentation得るmembers: DS.hasMany('App.Member')

サーバーから返される JSON はまったく同じであり、ログget('member.presentations')を記録すると、必要に応じてプレゼンテーションのリストを取得できるようになりました。

この時点で、これはバグのように見えますが、何か足りないのでしょうか? お気に入り従業員のマッピングを試みましたRESTAdapaterが、それは役に立ちませんでした... 役立つアダプタ構成が他にもあるのではないでしょうか?

4

1 に答える 1

1

これはサイドローディングの問題ではなく、埋め込みデータと構成の意味に関する私の側の誤解です。アダプタは次のように構成されているため:

App.APIRESTAdapter.map('App.Member', {
  favourites: {embedded: 'always'}
});

サーバーから期待される JSON 応答は次のとおりです。

{
  "member": {
    "api_token": "b84fd204b37d3fa3cee8a2b2cac8bd4fd02635a1",
    "api_token_expire": "1384027367",
    "id": 1,
    "favourites": [
      {
        "title": "Some kind of title",
        "category_id": 1,
        "id": 2,
        "tag_ids": [ 1 , 2 ],
        "employee_ids": [ 1 ]
      }
    ]
  }
}

レコードが埋め込みとしてフラグ付けされ"favourite_ids": [ X, X, X ]ている場合もそうでした。"favourites": [ HASH, HASH, HASH ]

于 2013-07-07T20:22:05.077 に答える