2012-09-27 19 views
12

Tengo dos modelos brasa con una relación como estaEmber datos: Almacenamiento de un modelo con una asociación en una solicitud

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

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

Si crear y guardar un nuevo registro de la siguiente manera:

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

veo 2 solicitudes POST al servidor:

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

y

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

La asociación está integrada por lo que me gustaría ver:

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

puedo lograr esto con el adaptador RESTO-brasa de datos o tengo que escribir mi propio código para hacer esto?

Respuesta

2

Estoy observando el mismo comportamiento en mi aplicación. Establecer 'incrustado' en verdadero solo le ayuda a obtener datos incrustados, pero mientras lo publica se generarán solicitudes por separado. Tiene que escribir su código si desea lograrlo en una sola solicitud.

+1

Ember-data no admite actualmente la realización de cambios a través de asociaciones incorporadas. La lógica 'DS.Store.commit()' podría ser revisada para introspectar asociaciones y usar datos incrustados, pero 'createRecord',' updateRecord', & 'deleteRecord', (y sus plurales para confirmaciones masivas) también necesitarían ser adaptados para actualizar correctamente el estado de los objetos asociados. – Mars

1

Esta no es una respuesta directa a su pregunta, pero por lo que vale, he encontrado que "luchar" contra el diseño de Ember al tratar de salvar varios modelos a la vez me llevó por un camino terrible.

Es mucho más fácil y fiable para agregar los atributos necesarios para un nuevo Bar a Foo y luego crear y devolver los nuevos objetos en el servidor, así:

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" } } } 

Sí, usted termina con un atributo no utilizado en Foo, pero se ahorra una gran cantidad de código.

Cuestiones relacionadas