Ember数据保存了一段感情

Cha*_*lie 9 javascript ember.js ember-data

我很难在ember数据中保存一对多的关系.我有这样的关系:

App.ParameterSet = DS.Model
    name: DS.attr("string")
    regions: DS.hasMany("App.Region")

App.Region = DS.Model
    name: DS.attr("string")
Run Code Online (Sandbox Code Playgroud)

如果我做这样的事情:

parameterSet = App.ParameterSet.find(5)
@transaction = @get("store").transaction()
@transaction.add(parameterSet)
region1 = App.Region.find(10)
region2 = App.Region.find(11)
parameterSet.set("name", "foo")
parameterSet.get("regions").pushObject(region)
@transaction.commit()
Run Code Online (Sandbox Code Playgroud)

然后我想看到带有这样的有效负载的PUT请求:

api/ParameterSets/5

{parameterSet: {name: "foo", regionIds:[10, 11]}}
Run Code Online (Sandbox Code Playgroud)

但相反,我得到了这个:

{parameterSet: {name: "foo"}}
Run Code Online (Sandbox Code Playgroud)

我不关心从孩子到父母的关系,但如果我添加parameterSet: DS.belongsTo("App.ParameterSet")到App.Region模型,那么我得到2个PUT请求到区域url的两个新关系,这不是我想要的.

我想这是一个多对多的关系,我不确定是否支持,但有关如何实现我所描述的任何想法?谢谢

ahm*_*eod 8

hasMany关系的序列化由addHasMany()方法处理json_serializer.js.

以下注释包含在源代码中:

默认的REST语义只是在嵌入时才添加has-many关系.如果最初通过ID加载关系,我们假设这是作为性能优化完成的,并且对has-many的更改应该保存为子项属于关系的外键更改.

要实现您的目标,一个选项是指示应该在您的适配器中嵌入关系.

App.Store = DS.Store.extend({
  adapter: DS.RESTAdapter.extend({
    serializer: DS.RESTSerializer.extend({
      init: function() {
        this._super();
        this.map('App.ParameterSet', {
          regions: { embedded: 'always' }
        });
      }
    })
  })
});
Run Code Online (Sandbox Code Playgroud)

当然,现在你的后端需要在参数集的JSON中实际嵌入相关区域的JSON.如果您想保持原样,可以addHasMany()使用自定义序列化覆盖.

App.Store = DS.Store.extend({
  adapter: DS.RESTAdapter.extend({
    serializer: DS.RESTSerializer.extend({
      addHasMany: function(hash, record, key, relationship) {
        // custom ...
      }
    })
  })
});
Run Code Online (Sandbox Code Playgroud)