Ember数据:在一个请求中保存具有关联的模型

时间:2012-09-27 17:58:38

标签: javascript rest ember.js ember-data

我有两个像这样的关系的ember模型

App.Foo = DS.Model.extend
   bar: DS.belongsTo("App.Bar", embedded: true)

App.Bar = DS.Model.extend
   primaryKey: "blah"
   blah: DS.attr "string

如果我创建并保存这样的新记录:

foo = App.store.createRecord App.Foo
foo.set "bar", App.Bar.createRecord(blah: "blahblah")
App.store.commit()

我看到有2个帖子请求到服务器:

URL: /foos
Payload: {"foo":{"bar":null}}

URL: /bars
Payload: {"bar":{"blah":"blahblah"}}

该关联已嵌入,因此我希望看到:

URL: /foos
Payload: {"foo":{"bar":{"blah":"blahblah"}}}

我可以使用ember-data REST适配器实现这一点,还是需要编写自己的代码才能实现这一目标?

2 个答案:

答案 0 :(得分:2)

我在我的应用程序中观察到相同的行为。 将“embedded”设置为true只会帮助您将数据设置为嵌入式,但在发布时会生成单独的请求。 如果要在一个请求中实现它,您已编写了代码。

答案 1 :(得分:1)

这不是你问题的直接答案,但是对于我的价值,我发现通过试图同时保存多个模型来“打击”Ember的设计让我走上了一条可怕的道路。

将新Bar的必需属性添加到Foo然后在服务器上创建并返回新对象会更容易,更可靠,如下所示:

App.Foo = DS.Model.extend({
  blah: DS.attr('string'),
  barName: DS.attr('string'),
  bar: DS.belongsTo('bar')
})

this.store.createRecord('foo', { blah: "stuff", barName: "foo" }).save()

# => POST /foos

Request:
{ foo: { blah: "stuff", bar_name: "boo" } }

Response:
{ foo: { id: 1, blah: "stuff", bar: { id: 1, name: "boo" } } }

是的,你最终在Foo上找到了一个未使用的属性,但是你节省了很多代码。