为什么在使用ember-data序列化时,“ManyToOne”关系的处理方式不同?

时间:2015-05-29 17:18:15

标签: ember.js ember-data

我的问题与“Ember Data: Saving relationships”高度相关,但我不关心嵌入 - 我只想要一个有效的OneToMany(双向)关系。以下面的模型为例:

App.Child = DS.Model.extend({
    name: DS.attr('string'),
    toys: DS.hasMany('toy'),
});
App.Toy = DS.Model.extend({
    name: DS.attr('string'),
    child: DS.belongsTo('child')
});

以及以下对象创建/保存:

var store = this.get('store');

store.createRecord('child', {name: 'Herbert'}).save().then(child => {
    return store.createRecord('toy', {name: 'Kazoo', child: child}).save())
}).then(toy => {
    child.get('toys').pushObject(toy);
    return child.save();
});

我希望孩子在序列化时参考玩具。例如。

之类的东西
{
   'name': 'Herbert',
   'toys': [ 1 ]
}

但事实并非如此。因为这是一个“manyToOne”关系,而且ember-data不会序列化这些:https://github.com/emberjs/data/blob/v1.0.0-beta.18/packages/ember-data/lib/serializers/json-serializer.js#L656

如果通过删除belongsTo使其成为ManyToNone关系,它将起作用,但您将丢失后引用。

为什么这种特殊行为?为什么ManyToOne与ManyToNne或ManyToMany不同,它应该得到这样的特殊处理?

这种行为记录在哪里?我完全错过了它,并认为这是我正在使用的Serializer / Adapter中的一个错误。

实现所需序列化的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我最终创建了我自己的,经过修改的序列化器:

import EmberPouch from 'ember-pouch';

export default EmberPouch.Serializer.extend({
  serializeHasMany: function(snapshot, json, relationship) {
    // make sure hasMany relationships are serialized.
    // http://stackoverflow.com/questions/20714858/ember-data-saving-relationships
    var key = relationship.key;

    if (this._canSerialize(key)) {
      var payloadKey;

      // if provided, use the mapping provided by `attrs` in
      // the serializer
      payloadKey = this._getMappedKey(key);
      if (payloadKey === key && this.keyForRelationship) {
        payloadKey = this.keyForRelationship(key, "hasMany", "serialize");
      }

      var relationshipType = snapshot.type.determineRelationshipType(relationship);

      if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || relationshipType === "manyToOne") {
        json[payloadKey] = snapshot.hasMany(key, { ids: true });
        // TODO support for polymorphic manyToNone and manyToMany relationships
      }
    }
  },
});

主要区别在于它也接受了许多关系,

并在application / adapter.js中使用它:

export default EmberPouch.Adapter.extend({
  defaultSerializer: "pouchserial",
....

在这个特定的(邮袋)情况下,最好将对父项的引用存储在子项上,这样父项在添加子项时不需要更新(这也可以避免冲突)。