3

私は ember.js とソファ DB バックエンドを使用するアプリケーションに取り組んでいます。これまではデータベースドライバーとして ember-resource を使用していましたが、ember-data の方が持続可能と思われるため、ember-data への切り替えを検討しています。

私はcouch DBで作業しているので、Couch DB-Adapterを使用しています。

データベース内のドキュメントには完全なオブジェクト構造が含まれているため、データベース ドライバで埋め込みオブジェクトを指定する必要があります。

しかし、サブオブジェクトを埋め込みとして指定していますが、ember-data はこれらのオブジェクトをメインの json から取得するのではなく、個別のリクエストで取得しているようです。

私のオブジェクト定義は次のとおりです。

App.UserProfile = DS.Model.extend({
    type:              DS.attr('string'),
    fullname:          DS.attr('string'),
    email:             DS.attr('string'),
    pictureUrl:        DS.attr('string'),
    social:            DS.hasMany('App.SocialWebAccount', { embedded: true }),
    .....
});

App.SocialWebAccount = DS.Model.extend({
    profile: DS.belongsTo('CaiMan.UserProfile'),
    site:    DS.attr('string'),
    account: DS.attr('string'),
    .....
});

サーバーデータは次のようなものです。

{
  "_id": "thoherr",
  "_rev": "55-d4abcb745b42fe61f1a2f3b31c461cce",
  "type": "UserProfile",
  "fullname": "Thomas Herrmann",
  "email": "test@thoherr.de",
  "pictureUrl": "",
  "social": [
      {
          "site": "socialFacebook",
          "account": "thoherr"
      },
      {
          "site": "socialXing",
          "account": "Thomas_Herrmann7"
      },
      {
          "site": "socialEmail",
          "account": "test@thoherr.de"
      }
   ]
}

読み込み後、UserProfile にはソーシャル データの ArrayProxy が含まれています。これには 3 つのエントリが入力されていますが、SocialWebAccount のインスタンスではなく、すべて未定義です!

この配列にアクセスしようとすると、ember-data は別のデータベース アクセスを行ってデータを取得しているように見えますが、カウチ DB アダプターが undefined では使用できない _id フィールドにアクセスするため、エラーが発生します....

私は何が欠けていますか?

「埋め込み」フラグは、データが既にjsonにあり、オブジェクトをjsonからインスタンス化できることを示していると思いましたか?

ember-data が埋め込まれたデータを取得しようとするのはなぜですか?

ヒントはありますか?

4

1 に答える 1

3

組み込みオプションが最近変更されたようです。ember-data githubのテスト ファイルでいくつかの情報を見つけました。

これらのテスト ファイルでは、埋め込みコンテンツは次のように定義されています。

Comment = App.Comment = DS.Model.extend({
  title: attr('string'),
  user: DS.belongsTo(User)
});

Post = App.Post = DS.Model.extend({
  title: attr('string'),
  comments: DS.hasMany(Comment)
});
Adapter = DS.RESTAdapter.extend();
Adapter.map(Comment, {
  user: { embedded: 'always' }
});

また

Adapter = DS.RESTAdapter.extend();
Adapter.map(Comment, {
  user: { embedded: 'load' }
});

「常に」は、IDのない埋め込みデータに使用されているようです(あなたの場合)、例えば

id: 1,
title: "Why not use a more lightweight solution?",
user: {
  name: "mongodb_expert"
}

「load」はID付きの埋め込みデータに使用されているようです

id: 1,
user: {
  id: 2,
  name: "Yehuda Katz"
}

あなたの特定のケースで役立つことを願っています。最近、hasMany 関係で多くの問題が発生しました (アダプターを機能させるには、アダプターを変更する必要がありました)。

于 2013-01-07T23:38:07.093 に答える