ember-data 中尚不支持多对多关系。目前,一种可能的解决方法是手动管理连接表。
A = DS.Model.extend({
abs: DS.hasMany('Ab'),
bs: function () {
return this.get('abs').getEach('b');
}
});
Ab = DS.Model.extend({
a: DS.belongsTo('A'),
b: DS.belongsTo('b')
});
B = DS.Model.extend({
abs: DS.hasMany('Ab'),
bs: function () {
return this.get('abs').getEach('a');
}
});
这只是起点。然后,您需要自定义模型和适配器,以便以工作方式发送/接收/保留记录
例如,在我们的应用程序中,我们{ includedJoin: true }
在 hasMany 关系中引入了一个选项,并将连接表声明为 JoinModel
A = DS.Model.extend({
abs: DS.hasMany('Ab', {includeJoin: true}),
...
});
DS.JoinModel = DS.Model.extend();
Ab = DS.JoinModel.extend({
... belongsTo relationships ...
});
然后在 Adapter 中,我们重写 create/update/delete 方法以忽略存储中的连接表生命周期
createRecords: function (store, type, records) {
if (!DS.JoinModel.detect(type)) {
this._super(store, type, records);
}
}
最后,在序列化程序中,我们重写该addHasMany
函数,以便将连接数据作为父模型中的嵌入 id 发送到服务器。
addHasMany: function (hash, record, key, relationship) {
var
options = relationship.options,
children = [];
//we only add join models, use of `includeJoin`
if (options.includedJoin) {
record.get(relationship.key).forEach(function (child) {
children.pushObject(child.toJSON({
includeId: true
}));
});
hash[key] = children;
}
}
在服务器端,我们使用带有 ActiveModelSerializer 的 Rails,所以唯一的小技巧定制是当我们更新父模型时,我们手动管理连接关系,并在连接表中创建/删除条目。