4

私は次のモデルを持っています:

App.Publication = DS.Model.extend({
  title: DS.attr('string'),
  bodytext: DS.attr('string'),
  author: DS.belongsTo('author')
});

App.Author = DS.Model.extend({
  name: DS.attr('string')
});

そして、次のjsonデータ:

{
  "publications": [
  {
    id: '1',
    title: 'first title',
    bodytext: 'first body',
    author_id: 100
  },
  {
    id: '2',
    title: 'second title',
    bodytext: 'second post',
    author_id: 200
  }
];
}

Ember Data RC12 ではこれが機能しました (json で author_id または author を指定すると、出版物には常に正しい著者がリンクされます)。

Ember Data 1.0.0 では、これは機能しなくなりました。author は常に null です。

一部のドキュメントでは、json データで "author_id" を使用しているため (単に作成者ではありません)、モデルでキーを指定する必要があることがわかりました。したがって:

 author: DS.belongsTo('author', { key: 'author_id' })

ただし、これは機能しません。パブリケーションの著者は null のままです。

今のところ唯一の解決策は、カスタム シリアライザーを実装し、author_id を (normailzeId を介して) オーサーにオーバーライドすることです。バックエンドのデータ構造を変更できません...したがって:

App.MySerializer = DS.RESTSerializer.extend({
  //Custom serializer used for all models
  normalizeId: function (hash) {
    hash.author = hash.author_id;
    delete hash.author_id;
    return hash;
  }
});

上記は正しい方法ですか?

4

2 に答える 2

7

Ember Data 1.0 は、デフォルトでペイロードの正規化を行わなくなりました。のkey構成DS.belongsToも削除されているため、カスタム シリアライザーを実装する必要があります。

normalizeIdは、主キーを で常に使用できるように変換するために使用される内部シリアライザー関数ですid。これをオーバーライドしないでください。

keyForRelationship代わりに、この目的のために提供されているメソッドをオーバーライドできます。

次のようなものを使用できます。

App.ApplicationSerializer = DS.RESTSerializer.extend({
  keyForRelationship: function(rel, kind) {
    if (kind === 'belongsTo') {
      var underscored = rel.underscore();
      return underscored + "_id";
    } else {
      var singular = rel.singularize();
      var underscored = singular.underscore();
      return underscored + "_ids";
    }
  }
});

注:App.ApplicationSerializerアプリケーションの既定のシリアライザーとして使用されるように、シリアライザーの名前も に変更しました。

最後に、まだ見つからない場合は、https ://github.com/emberjs/data/blob/master/TRANSITION.md の移行ノートをご覧ください。

最初の 1.0.0.beta.1 リリースの直後に移行ドキュメントを読んだ場合は、特にシリアル化に関して多くの追加があったため、もう一度確認することをお勧めします。

于 2013-09-09T06:19:39.473 に答える