Ember Data - 保存记录时丢失 has many 关系

15

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

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

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

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

谢谢

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

我还不确定这是一个漏洞还是期望的/预期的行为。


1
在测试中遇到了相同的问题,但是有一个事实让我感到困惑,那就是FixtureAdapter没有使用任何序列化器... - Roman
1
我认为这个想法是,“通常”(例如,使用ORM到关系存储),在manyToOne中发送hasMany是多余的,并且在大型关系中可能会很昂贵,因为指针由“toOne”一侧“拥有”。但是,在这种情况下,它实际上不应该使用序列化对象作为hasMany-s的源。对于序列化,最好的方法可能是relationship.options具有“serialize”:true/false。 - shaunc

7

我遇到了同样的问题,采用了同样的解决方案。这难道不是ember-data的一个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
        }
    }
});

Ember数据肯定需要这种改进。你的解决方案非常有效。 - Daniel Kmak

3
这不是一个错误,而是Ember Data中的设计选择。
JSONSerializer.serializeHasMany方法不会序列化manyToOne。通常情况下,外键被保存在关系的belongsTo一侧,hasOne可能不会保存外键。
解决方法可以在这篇文章中找到:http://www.toptal.com/emberjs/a-thorough-guide-to-ember-data ,请看“一对多和多对一关系”部分。其中的hack是使用嵌入式记录混合模式来强制序列化DS.hasMany IDs,像这样: attrs: {someRelationship: {serialize: 'ids'}}

2
现在 DS.RelationshipChange 已被移除。您应该使用 record.constructor,如下所示: record.constructor.determineRelationshipType(relationship) 这将显示您的关系类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接