如何使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' } } });