Ember.js 余烬数据保存记录丢失有很多关系

Ember.js 余烬数据保存记录丢失有很多关系,ember.js,ember-data,Ember.js,Ember Data,我在使用Ember数据设备适配器时遇到问题。保存记录时,该记录的所有关联都将丢失。我创建了一个简单的JS Bin来说明这个问题: 如果编辑任何用户并保存,所有项目都将消失 这是使用余烬1.0.0和余烬数据的最新金丝雀版本 我不确定我是否做错了什么,或者这是否是余烬数据的问题 感谢回答我的问题,DS.JSONSerializer.serializeHasMany似乎只处理和序列化manytone和manyToMany关系类型。您可以使用模型的自定义序列化程序来覆盖此行为: var get = Em

我在使用Ember数据设备适配器时遇到问题。保存记录时,该记录的所有关联都将丢失。我创建了一个简单的JS Bin来说明这个问题:

如果编辑任何用户并保存,所有项目都将消失

这是使用余烬1.0.0和余烬数据的最新金丝雀版本

我不确定我是否做错了什么,或者这是否是余烬数据的问题


感谢回答我的问题,
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成员数据肯定需要这种改进。你的解决方案很有魅力。