Подтвердить что ты не робот

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 или мне нужно написать собственный код для этого?

4b9b3361

Ответ 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, но вы сохраните себе много кода.