我正在为一个有两种型号的应用程序使用Ember本地存储适配器:Organizations和Members。这种关系是组织"有许多"成员,而成员"属于"组织,如下所示:
App.Org = DS.Model.extend({
name: DS.attr('string'),
description: DS.attr('string'),
members: DS.hasMany('App.Member')
});
App.Member = DS.Model.extend({
name: DS.attr('string'),
org: DS.belongsTo('App.Org')
});
在应用程序的jsbin中,您可以将成员和组织添加到本地存储中,这非常有效(这意味着当我添加新组织时,其选定的成员将添加到"成员"hasMany关系中)。
除了添加新的组织信息外,我还想序列化新创建的组织记录,以便通过AJAX发送到服务器(不,我不想使用RESTAdapter)。
然而,"成员"hasMany关系在序列化中完全缺失,所以这就是我正在进行的序列化(如果您添加一些成员,然后打开控制台,您可以自己查看):
{
name: "Organization name",
description: "description of the org"
}
这是我想要的序列化:
{
name: "Organization name",
description: "description of the org",
members: ["id_of_member_1", "id_of_member_2", "id_of_member_3"]
}
这就是我进行序列化的方式:
App.OrganizationController = Ember.ArrayController.extend({
createOrg: function(){
var neworg = App.Org.createRecord({
name: this.get('newname'),
description: this.get('newdescription')
});
neworg.get('members').pushObjects(this.get('newmembers'));
neworg.save();
var serializer = DS.RESTSerializer.create({});
console.log(serializer.serialize(neworg));
}
...
如果序列化不是最好的方法,那么另一种方法可能是将"成员"作为字符串数组属性,但到目前为止,这条路径已经失败了
除了建议之外,请提供一个基于应用程序当前jsbin的工作jsbin。因为我尝试过不起作用的东西。
请记住,此应用程序是使用Ember Data本地存储适配器设置的。
您可以使用DS.EmbeddedRecordsMixin
来完成此操作。org-serializer.js
看起来像:
import DS from 'ember-data';
export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
members: { serialize: 'ids' }
}
});
请参阅此处的文档。