14

私は過去数日間、主キーと最後のバージョンのEmberDataで苦労してきました。

最初にGitHubのBreakingChangesファイルでそれを行う方法を読みましたが、明らかに時代遅れです。私は他のいくつかの 方法を試しましたが(IRCのPeter Wagenetの助けを借りて)、どれもうまくいかないようです。

モデルに主キーを作成したいと思います。また、MongoDBを使用しているため、の代わりにslugを使用したいと思います。_idid

誰かがこれを行う方法を理解しましたか?私の根本的な問題は、モデルでいくつか実行すると、モデルレコードが2回ロードされることですApp.MyModel.find()

4

5 に答える 5

9

Ember Data 1.0ベータの時点でprimaryKey、それぞれのシリアライザーで定義します。

アプリ全体

App.ApplicationSerializer = DS.RESTSerializer.extend({
  primaryKey: '_id'
});

シングルタイプの場合

App.FooSerializer = DS.RESTSerializer.extend({
  primaryKey: '_id'
});

モデル上で引き続き参照しますがid、EmberDataは_id転送中にシリアル化/逆シリアル化します。

例:http ://emberjs.jsbin.com/OxIDiVU/635/edit

詳細については、こちらをご覧ください:http: //emberjs.com/api/data/classes/DS.RESTSerializer.html#property_primaryKey

于 2014-06-11T00:30:47.013 に答える
3

モデルの主キーをslugにしたいのですが、MongoDBを使用しているので、idの代わりに_idを使用したいと思います。

アダプタのmapAPIを使用して、主キーとして使用する必要がある属性を指定します。

App.Adapter.map('App.Person', {
  primaryKey: '_id'
});

詳細については、 serializer.jsapiドキュメントを参照してください。レコードIDのシリアル化方法をさらにカスタマイズする必要がある場合は、ここでaddId説明するフックを使用してください。

ember-dataはまだ活発に開発中であるため、この機能に関するドキュメントは多少制限されており、1.0リリースより前に変更される可能性があります。それまでの間、これが実際に行われている例を確認するには、ember-dataテストスイートを参照してください。例えば:

于 2013-03-18T15:07:23.190 に答える
1

Nikitaによって提案された解決策が機能しない場合(ember-dataのリビジョン11を使用した場合は機能しませんでした)、RESTAdapterを使用するときに主キーを変更した方法は次のとおりです。

App.Adapter = DS.RESTAdapter.extend({
    serializer: "App.MySerializer"
});

// notice we extend the RESTSerializer, not Serializer!
App.MySerializer = DS.RESTSerializer.extend({
    primaryKey: function(type) {
        return '_id'; // you get it...
    }
});

これはおそらくOPにはもう役に立たないことは承知していますが、一部の人にとっては役立つかもしれないので、それでも投稿します。

于 2013-03-07T09:03:45.650 に答える
0

次のようにアダプタを拡張してみてください。

   App.RESTSerializer = DS.RESTSerializer.extend({
      init: function() {
        this._super();

        this.map('App.MyModel', {
          primaryKey: "_id"
        });
      }
    });
于 2013-02-16T12:35:26.707 に答える
0

私はアプリケーションでMongoDBEmber -Data1.0.0-beta.6を使用していますが、_idはEmber1.4.0でも問題を引き起こしました。返されたJSON配列がルートプロパティ「people」にネストされていると仮定して、問題を解決するために私が行ったことは次のとおりです。

App.ApplicationSerializer = DS.RESTSerializer.extend({
    normalizeHash: {
        people: function(hash) {
            hash.id = hash._id;
            delete hash._id;
            return hash;
        }
    }
});

もちろん、これはアプリケーション全体のシリアライザーですが、次のようなものを使用して特定のパスに制限できます。App.MyPathSerializer = DS.RESTSerializer.extend({ ... });

于 2014-02-16T07:10:41.997 に答える