1

私はしばらくの間 Ember Data を使用してきましたが、ほとんど満足しています。REST API を合理的な方法で構造化することを余儀なくされた方法が気に入っています。

私はいくつかの問題に直面しています.ここにそれらの1つがあります.以前はフラット構造のモデルを使用していました.

App.Pageview = DS.Model.extend({
  event: attr('string'),
  value: attr('string'),
  time: attr('date'),
  count: attr('number')
});

この場合、値はすべて 1 つの文字列の URL でした。このモデルは、次のような JSON でうまく機能します。

{
  "event" : "pageview",
  "value" : "google.com/some/page",
  "time" : "2013-01-31T16:30:00.000Z",
  "count" : 14
}

データベースで JSON を構造化する方法を変更して、クエリを実行しやすくしたので、次のようになりました。

{
  "event" : "pageview",
  "value" : {
    "url" : "google.com/some/page",
    "domain" : "google.com",
    "path" : "/some/page"
  },
  "time" : "2013-01-31T16:30:00.000Z",
  "count" : 14
}

でも今は、どこに行けばいいのかわからない。私はこのようなことをやってみました:

App.Pageview = DS.Model.extend({
  event: attr('string'),
  value: {
      domain: attr('string'),
      url: attr('string'),
      path: attr('string')
  },
  time: attr('date'),
  count: attr('number')
});

しかし、それはうまくいかないようだったので、次のようにテストしました。

  console.log(item.get('value'));
  console.log(item.get('value.domain'));
  // console.log(item.get('value').get('domain')); // throws 
  console.log(item.get('value').domain);

そして、次の結果を得ました: http://d.pr/i/izDD

だから私はもう少し掘り下げて、おそらく次のようなことをする必要があることを発見しました:

App.Pageview = DS.Model.extend({
  event: attr('string'),
  value: DS.belongsTo('App.SplitUrl', {embedded:true}),
  time: attr('date'),
  count: attr('number')
});

App.SplitUrl = DS.Model.extend({
  domain: attr('string'),
  url: attr('string'),
  path: attr('string')
});

しかし、これは私が得るエラーのために機能しません:

Uncaught TypeError: Cannot call method 'hasOwnProperty' of undefined 

これは通常、ID なしで REST API にオブジェクトを送信したときに発生します。私のREST APIからの正確な応答は次のとおりです。

http://d.pr/n/UyW0

注: id が _id フィールドにあることを期待するようにアダプターをオーバーロードして、mongodb でより適切に/より簡単に動作できるようにしました。これは、アダプターをオーバーロードした方法です。

App.Store = DS.Store.extend({
  revision: 11,
  adapter: DS.RESTAdapter.create({
    serializer: DS.JSONSerializer.extend({
      primaryKey: function(type) {
        return '_id';
      }
    }), 
    namespace: 'api'
  })
});

誰でもこれを理解するのを手伝ってもらえますか?

4

1 に答える 1

1

ember-data リビジョン 11 を使用していると仮定して、代わりにアダプターに埋め込まれた値を設定してみてください。

DS.RESTAdapter.map('App.SplitUrl',{value:{ embedded:'always'}}); 
于 2013-02-01T12:43:17.927 に答える