Ember数据 - 保存记录损失有很多关系

时间:2013-09-30 11:28:11

标签: ember.js ember-data

我在使用Ember数据夹具适配器时遇到问题。保存记录时,所有记录的所有关联都将丢失。我创建了一个简单的JS Bin来说明问题:http://jsbin.com/aqiHUc/42/edit

如果您编辑任何用户并保存,则所有项目都会消失。

这是使用Ember 1.0.0和最新的Ember Data canary版本。

我不确定我是否做错了,或者这是否与Ember Data有关。

由于

4 个答案:

答案 0 :(得分:10)

要回答我的问题,DS.JSONSerializer.serializeHasMany似乎只处理和序列化manyToNone和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');
    }
  }
});

仍然不太确定这是否是一个错误,或者这是否是预期/预期的行为。

答案 1 :(得分:7)

我遇到了同样的问题并找到了同样的解决方案。当然这是ember-data中的一个错误?

这是我的解决方案,唯一的区别是我正在修改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
        }
    }
});

答案 2 :(得分:3)

这不是一个错误,而是Ember Data中的设计选择。

JSONSerializer.serializeHasMany方法没有按设计序列化manyToOne;通常外键持久存在于关系的belongsTo端,而hasOne可能不会持久存在外键

本文解释了解决方法:http://www.toptal.com/emberjs/a-thorough-guide-to-ember-data请参阅“一对多和多对一关系”部分,黑客是强制将DS.hasMany ID序列化为好吧,您可以像attrs: {someRelationship: {serialize: 'ids'}}

那样使用Embedded Records Mixin。

答案 3 :(得分:2)

现在删除了DS.RelationshipChange。您应该使用record.constructor,如:

record.constructor.determineRelationshipType(relationship)

显示您的关系类型。