17

embedded hasManyember データを正しく処理できません。

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

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();

joincolumn の POST が送信され、親はダーティではありません

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

4

4 に答える 4

46

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

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

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

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

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

DS.RESTAdapter.map('App.Post', {
  comments: { embedded: 'always' }
});
于 2013-01-14T18:42:11.833 に答える
7

I have the exact same problem.

This bug has been reported on the ember data issue tracker. The following PR adds 2 failing tests showing the problem: https://github.com/emberjs/data/pull/578

It seems that there is no workaround right now.

EDIT:

sebastianseilund opened a PR 2 days ago which fixes your problem. Have a look at: https://github.com/emberjs/data/pull/629/files

于 2013-01-16T16:05:10.683 に答える
5

これは私のために働いたものです(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' }
  }
});
于 2014-05-13T20:42:50.370 に答える
5

他の人がこの投稿に出くわし、現在のバージョンの 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'
  })
});
于 2014-03-04T20:47:39.510 に答える