web-dev-qa-db-ja.com

埋め込まれたhasMany関係をemberデータで機能させる方法

embeddedhasManyをemberデータで正しく動作させることができません。

私はこのようなものを持っています

_App.Post = DS.Model.extend({
  comments: DS.hasMany('App.Comment')
});

App.Comment = DS.Model.extend({
  post: DS.hasMany('App.Post'),
  name: attr('string')
});
_

そして私のAPIは_GET /post_に対して以下を返します:

_[
  {
   id: 1
   comments: [{name: 'test'}, {name: 'test2'}]
  },
  ...
]
_

これを_POST /post_で送信する必要があります:

_[
  {
    comments: [{name: 'test'}, {name: 'test2'}]
  },
  ...
]
_

Emberモデルを操作して、適切なリクエストを行わせたい:

_var post = App.store.createRecord(App.Post, hash_post_without_comments);
post.get('comments').createRecord(hash_comment);

App.store.commit(); // This should call the POST api 
_

そして

_var posts = App.store.find(App.Post); // This should call the GET api 
_

post: DS.hasMany('App.Post', {embedded: true})のようなものを試してみると、GETは機能していますが、POSTは、2つのレコードだけでなくPOST親のもの。

編集:私の実際のユースケース

1-マスターからemberデータを作成しました

2-私のアダプター:RESTAdapter

3-シリアライザー:JSONSerializer

4-追加しました

_App.MyAdapter.map('App.Join', {
    columns: { embedded: 'always' }
});
_

5-私のモデルは次のとおりです。

_App.Join = DS.Model.extend({
    rowCount: DS.attr('number'),
    columns: DS.hasMany('App.JoinColumn'),
});

App.JoinColumn = DS.Model.extend({
    join: DS.belongsTo('App.Join')
});
_

6-いつ:

_var a = App.Join.find(1);
a.get('columns').createRecord({});
App.store.commit();
_

a POST for joincolumnが送信され、親がダーティではない

何が足りないのですか?

17
Riad

私はまったく同じ問題を抱えています。

このバグはemberデータ問題トラッカーで報告されています。次のPRは、問題を示す2つの失敗したテストを追加します: https://github.com/emberjs/data/pull/ 578

現在、回避策はないようです。

編集:

sebastianseilundは2日前にPRを開始し、問題を解決しました。ご覧ください: https://github.com/emberjs/data/pull/629/files

7
bobey

マスターでは、正しいAPIは次のとおりです。

App.Adapter.map('App.Post', {
  comments: { embedded: 'always' }
});

embeddedの2つの可能な値は次のとおりです。

  • load:子レコードはロード時に埋め込まれますが、スタンドアロンレコードとして保存する必要があります。これが機能するためには、子レコードにIDが必要です。
  • always:子レコードはロード時に埋め込まれ、同じレコードに埋め込まれて保存されます。もちろん、これはレコードのダーティに影響します(子レコードが変更された場合、アダプタは親レコードをダーティとしてマークします)。

カスタムアダプタがない場合は、DS.RESTAdapterで直接mapを呼び出すことができます。

DS.RESTAdapter.map('App.Post', {
  comments: { embedded: 'always' }
});
46
Yehuda Katz

他の人がこの投稿に出くわし、現在のバージョンのember-dataで何が機能するかを理解するのに苦労している場合に備えて、これに更新を追加します。

Ember Data 1.0.0.beta.7の時点で、シリアライザーの適切なメソッドをオーバーライドする必要があります。例を次に示します。

1)シリアライザーを再度開きます(クレジット この投稿 ):

DS.RESTSerializer.reopen({
  serializeHasMany: function(record, json, relationship) {
    var hasManyRecords, key;
    key = relationship.key;
    hasManyRecords = Ember.get(record, key);
    if (hasManyRecords && relationship.options.embedded === "always") {
      json[key] = [];
      hasManyRecords.forEach(function(item, index) {
        // use includeId: true if you want the id of each model on the hasMany relationship
        json[key].Push(item.serialize({ includeId: true }));
      });
    } else {
      this._super(record, json, relationship);
    }
  }
});

2)モデルの関係にembedded: 'always'オプションを追加します。

App.Post = DS.Model.extend({
  comments: DS.hasMany('comment', {
    embedded: 'always'
  })
});
5
steakchaser

これは私のために働いたものです(Ember 1.5.1 + pre.5349ffcb、Ember Data 1.0.0-beta.7.f87cba88):

App.Post = DS.Model.extend({
  comments: DS.hasMany('comment', { embedded: 'always' })
});

App.PostSerializer = DS.ActiveModelSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    comments: { embedded: 'always' }
  }
});
5
Patrick Fisher