如何在Ember Data本地存储适配器/序列化器中添加hasMany关系?

时间:2013-07-23 01:40:20

标签: ember.js ember-data

我将Ember本地存储适配器用于具有两个模型的应用程序:组织和成员。关系是组织“有很多”成员,成员“属于”组织,如下:

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 of the app中,您可以将成员和组织添加到本地存储中,这样可以完美地工作(这意味着当我添加新组织时,其选定的成员将添加到“成员”中的hasMany关系中)。

除了添加新的组织信息之外,我还希望将新创建的组织记录序列化,以便通过AJAX发送到服务器(不,我不想使用RESTAdapter)。

但是,“成员”之间的序列化完全没有关系,所以这是我得到的序列化(你可以see for yourself if you add some members and then open up the console):

{ 
    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));
    }
    ...

如果序列化不是可行的方法,另一种方法可能是使“成员”成为字符串数组属性,但到目前为止,这条路径已经失败了。

除了建议之外,请根据current jsbin of the app提供有效的jsbin。因为我tried things无效。

请记住,此应用程序是使用Ember Data本地存储适配器设置的。

1 个答案:

答案 0 :(得分:0)

您可以使用DS.EmbeddedRecordsMixin执行此操作。 org-serializer.js看起来像是:

import DS from 'ember-data';

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    members: { serialize: 'ids' }
  }
});

请参阅文档here