如何使embedded式has有许多关系与烬数据一起工作

我无法embedded hasMany与烬数据正确工作。

我有这样的事情

 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正在尝试为两个logging(不仅是父logging)进行POST。

编辑:我真正的用例

1-我刚刚build立了来自master的ember数据

2-我的适配器:RESTAdapter

3-序列化程序:JSONSerializer

我补充说

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

发送用于连接列的POST并且父节点不脏

我错过了什么?

我有完全一样的问题。

这个bug已经在ember数据问题跟踪器上报告过了。 以下PR增加了两个失败的testing显示问题: https : //github.com/emberjs/data/pull/578

看来现在没有解决方法。

编辑:

sebastianseilund 2天前开了一个PR,解决了你的问题。 看看: https : //github.com/emberjs/data/pull/629/files

在master上,正确的API是:

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

embedded的两个可能的值是:

  • load :加载时embedded子logging,但应保存为独立logging。 为了这个工作,子logging必须有一个ID。
  • always :加载时embedded子logging,并embedded到相同的logging中。 这当然会影响logging的肮脏(如果子logging发生变化,适配器会将父logging标记为脏)。

如果您没有自定义适配器,则可以直接在DS.RESTAdapter上调用map

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

添加一个更新,使其他人遇到这个post,并很难弄清楚什么与当前版本的烬数据。

从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' }) }); 

这是我工作的东西(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' } } });