2012-09-27 7 views
12

Ich habe zwei ember Modelle mit einer Beziehung wie dieserEmber Daten: Speichern eines Modells mit einem Verein in einer Anfrage

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

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

Wenn ich einen neuen Datensatz wie folgt erstellen und speichern:

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

ich sehe 2 Post-Anfragen an den Server:

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

und

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

Der Verband eingebettet ist, so würde ich gerne sehen:

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

Kann ich diesen Adapter mit dem glühenden Kohlen-Daten REST erreichen oder muß ich meinen eigenen Code schreiben, dies zu tun?

Antwort

2

Ich beobachte das gleiche Verhalten in meiner Anwendung. Wenn Sie "embedded" auf "true" setzen, können Sie nur Daten als eingebettete Daten abrufen, aber während Sie diese veröffentlichen, werden separate Anforderungen generiert. Sie haben Ihren Code geschrieben, wenn Sie dies in einer Anfrage erreichen möchten.

+1

Ember-Daten unterstützt derzeit keine Änderungen über eingebettete Verknüpfungen. Die 'DS.Store.commit()' Logik könnte überarbeitet werden, um Assoziationen zu prüfen und eingebettete Daten zu verwenden, aber "createRecord", "updateRecord" und "deleteRecord" (& deren Plural für Massen-Commits) müssten auch angepasst werden um den Zustand der zugehörigen Objekte korrekt zu aktualisieren. – Mars

1

Dies ist keine direkte Antwort auf Ihre Frage, aber für das, was es wert ist, habe ich festgestellt, dass "Embers" Design zu kämpfen, indem Sie mehrere Modelle auf einmal zu speichern, führte mich einen schrecklichen Weg.

Es ist viel einfacher und zuverlässiger die erforderlichen Attribute für einen neuen Bar zu Foo und dann erstellen und geben die neuen Objekte auf dem Server, wie so hinzuzufügen:

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

Ja, Sie am Ende mit ein unbenutztes Attribut auf Foo, aber Sie sparen sich eine Menge Code.

Verwandte Themen