Ember.js 为什么是“a”;“多通”;在余烬数据中序列化时,关系的处理方式是否不同?

Ember.js 为什么是“a”;“多通”;在余烬数据中序列化时,关系的处理方式是否不同?,ember.js,ember-data,Ember.js,Ember Data,我的问题与“”高度相关,但我不关心嵌入-我只想要一个工作的一对一(双向)关系。以以下模型为例: 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

我的问题与“”高度相关,但我不关心嵌入-我只想要一个工作的一对一(双向)关系。以以下模型为例:

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 ]
}
但事实并非如此。因为这是一种“多通”关系,而且余烬数据不会序列化这些关系:

如果通过删除belongs使其成为manytone关系,它将起作用,但会丢失back引用

为什么会有这种特殊行为?为什么许多人与许多人或许多人不同,应该得到如此特殊的待遇

这种行为记录在哪里?我完全忽略了它,并认为这是我正在使用的序列化程序/适配器中的一个bug


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

我最终创建了自己的、经过简单修改的序列化程序:

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",
....

在这种特定的(小袋)情况下,最好只在子对象上存储对父对象的引用,这样在添加子对象时父对象就不需要更新(这也避免了冲突)

为什么要第二次救孩子?第一次保存玩具会给它一个外键,而且ember data的存储是唯一的真实来源,因此所有客户关系都会起作用。然后,您应该返回第二个
。然后
和链承诺,而不是嵌套第二次保存是保存添加的玩具,而不是保留任何差异,属性保持为空(这就是我问题的重点)。关于嵌套和链接承诺,你是对的,但这对最终结果没有影响。也许更好的问题是,你想实现什么?为什么你想让孩子用一系列玩具ID进行序列化?