我的问题与“Ember Data: Saving relationships”高度相关,但我不关心嵌入 - 我只想要一个有效的OneToMany(双向)关系。以下面的模型为例:
App.Child = DS.Model.extend({
name: DS.attr('string'),
toys: DS.hasMany('toy'),
});
App.Toy = DS.Model.extend({
name: DS.attr('string'),
child: DS.belongsTo('child')
});
以及以下对象创建/保存:
var store = this.get('store');
store.createRecord('child', {name: 'Herbert'}).save().then(child => {
return store.createRecord('toy', {name: 'Kazoo', child: child}).save())
}).then(toy => {
child.get('toys').pushObject(toy);
return child.save();
});
我希望孩子在序列化时参考玩具。例如。
之类的东西{
'name': 'Herbert',
'toys': [ 1 ]
}
但事实并非如此。因为这是一个“manyToOne”关系,而且ember-data不会序列化这些:https://github.com/emberjs/data/blob/v1.0.0-beta.18/packages/ember-data/lib/serializers/json-serializer.js#L656
如果通过删除belongsTo使其成为ManyToNone关系,它将起作用,但您将丢失后引用。
为什么这种特殊行为?为什么ManyToOne与ManyToNne或ManyToMany不同,它应该得到这样的特殊处理?
这种行为记录在哪里?我完全错过了它,并认为这是我正在使用的Serializer / Adapter中的一个错误。
实现所需序列化的正确方法是什么?
答案 0 :(得分:0)
我最终创建了我自己的,经过修改的序列化器:
import EmberPouch from 'ember-pouch';
export default EmberPouch.Serializer.extend({
serializeHasMany: function(snapshot, json, relationship) {
// make sure hasMany relationships are serialized.
// http://stackoverflow.com/questions/20714858/ember-data-saving-relationships
var key = relationship.key;
if (this._canSerialize(key)) {
var payloadKey;
// if provided, use the mapping provided by `attrs` in
// the serializer
payloadKey = this._getMappedKey(key);
if (payloadKey === key && this.keyForRelationship) {
payloadKey = this.keyForRelationship(key, "hasMany", "serialize");
}
var relationshipType = snapshot.type.determineRelationshipType(relationship);
if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || relationshipType === "manyToOne") {
json[payloadKey] = snapshot.hasMany(key, { ids: true });
// TODO support for polymorphic manyToNone and manyToMany relationships
}
}
},
});
主要区别在于它也接受了许多关系,
并在application / adapter.js中使用它:
export default EmberPouch.Adapter.extend({
defaultSerializer: "pouchserial",
....
在这个特定的(邮袋)情况下,最好将对父项的引用存储在子项上,这样父项在添加子项时不需要更新(这也可以避免冲突)。