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"}}}
Могу ли я достичь этого с помощью REST-адаптера ember-data или мне нужно написать собственный код для этого?
Ответы
Ответ 1
Я наблюдаю то же поведение в своем приложении.
Установка "embedded" в true позволяет только получить данные как встроенные, но при отправке его будут генерироваться отдельные запросы.
Вы пишете свой код, если хотите достичь его в одном запросе.
Ответ 2
Это не прямой ответ на ваш вопрос, но для того, что стоит, я обнаружил, что "боевой" дизайн 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
, но вы сохраните себе много кода.