15

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

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

这是使用 Ember 1.0.0 和 Ember Data 的最新金丝雀版本。

我不确定我做错了什么,或者这是否是 Ember Data 的问题。

谢谢

4

4 回答 4

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');
    }
  }
});

仍然不太确定这是一个错误还是这是所需/预期的行为。

于 2013-09-30T12:35:36.327 回答
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
        }
    }
});
于 2013-10-09T11:49:54.773 回答
3

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

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

这篇文章中解释了一种解决方法:http ://www.toptal.com/emberjs/a-thorough-guide-to-ember-data请参阅“一对多和多对一关系”部分hack 是为了强制 DS.hasMany ID 也被序列化,您可以使用 Embedded Records Mixin。像这样attrs: {someRelationship: {serialize: 'ids'}}

于 2014-07-07T20:14:25.993 回答
2

现在 DS.RelationshipChange 已被删除。您应该像这样使用record.constructor:

record.constructor.determineRelationshipType(relationship)

显示您的关系类型。

于 2015-06-17T11:00:51.287 回答