我有两个像这样的关系的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适配器实现这一点,还是需要编写自己的代码才能实现这一目标?
答案 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
上找到了一个未使用的属性,但是你节省了很多代码。