Отношенията много към много все още не се поддържат в 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