Отношения «многие ко многим» еще не поддерживаются в 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 ...
});
Затем в адаптере мы переопределяем методы создания/обновления/удаления, чтобы игнорировать жизненный цикл таблицы соединений в хранилище.
createRecords: function (store, type, records) {
if (!DS.JoinModel.detect(type)) {
this._super(store, type, records);
}
}
Наконец, в сериализаторе мы переопределяем функцию addHasMany
, чтобы отправлять данные соединения на сервер в виде встроенных идентификаторов в родительских моделях.
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;
}
}
На стороне сервера мы используем Rails с ActiveModelSerializer, поэтому единственная непростая настройка — это когда мы обновляем родительские модели, мы вручную управляем отношением соединений и создаем/удаляем записи в таблице соединений.
person
sly7_7
schedule
09.11.2012