Ember.js 余烬数据保存记录丢失有很多关系
我在使用Ember数据设备适配器时遇到问题。保存记录时,该记录的所有关联都将丢失。我创建了一个简单的JS Bin来说明这个问题: 如果编辑任何用户并保存,所有项目都将消失 这是使用余烬1.0.0和余烬数据的最新金丝雀版本 我不确定我是否做错了什么,或者这是否是余烬数据的问题Ember.js 余烬数据保存记录丢失有很多关系,ember.js,ember-data,Ember.js,Ember Data,我在使用Ember数据设备适配器时遇到问题。保存记录时,该记录的所有关联都将丢失。我创建了一个简单的JS Bin来说明这个问题: 如果编辑任何用户并保存,所有项目都将消失 这是使用余烬1.0.0和余烬数据的最新金丝雀版本 我不确定我是否做错了什么,或者这是否是余烬数据的问题 感谢回答我的问题,DS.JSONSerializer.serializeHasMany似乎只处理和序列化manytone和manyToMany关系类型。您可以使用模型的自定义序列化程序来覆盖此行为: var get = Em
感谢回答我的问题,
DS.JSONSerializer.serializeHasMany
似乎只处理和序列化manytone和manyToMany关系类型。您可以使用模型的自定义序列化程序来覆盖此行为:
var get = Ember.get;
App.UserSerializer = DS.RESTSerializer.extend({
serializeHasMany: function(record, json, relationship) {
var key = relationship.key;
var relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship);
if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || relationshipType === 'manyToOne') {
json[key] = get(record, key).mapBy('id');
}
}
});
仍然不能确定这是一个bug还是期望/预期的行为 我遇到了同样的问题,得到了同样的解决方案。这肯定是余烬数据中的错误吗 这是我的解决方案,唯一的区别是我正在修改JSONSerializer,而不是扩展的RESTSerializer,因为我使用的是本地存储适配器:
DS.JSONSerializer.reopen({
serializeHasMany : function(record, json, relationship) {
var key = relationship.key;
var relationshipType = DS.RelationshipChange.determineRelationshipType(
record.constructor, relationship);
if (relationshipType === 'manyToNone'
|| relationshipType === 'manyToMany'
|| relationshipType === 'manyToOne') {
json[key] = Ember.get(record, key).mapBy('id');
// TODO support for polymorphic manyToNone and manyToMany
// relationships
}
}
});
这不是一个bug,而是余烬数据中的一个设计选择 JSONSerializer.serializeHasMany方法没有按设计序列化多个One;通常,外键会保留在关系的belongsTo一侧,而hasOne可能不会保留外键
本文介绍了一种解决方法:请参阅“一对多和多对一关系”一节。黑客攻击的目的是强制DS.hasMany ID序列化,您也可以使用嵌入的记录混合。像这样,
attrs:{someRelationship:{serialize:'ids'}}
现在DS.RelationshipChange被删除。您应该使用record.constructor,如:
record.constructor.determinateRelationshipType(关系)
这显示了您的关系类型。在测试中遇到了相同的问题,但与一个事实相混淆,即FixtureAdapter不使用任何序列化程序……我认为这种想法是“典型的”(例如,使用ORM到关系存储),在manyOne中发送hasMany是多余的,并且对于大型关系来说可能代价高昂,因为指针是“拥有的”在“图恩”那边。但是,在这种情况下,它实际上不应该使用序列化对象作为hasMany-s的源。对于序列化,最好的可能是relationship.options具有“serialize”:true/false成员数据肯定需要这种改进。你的解决方案很有魅力。