2016-07-07 18 views
0

Rechnung-Modell: sailsjs - ein POST mehrere Datensätze und Verbände erstellt

attributes: { 
    number: { 
    type: 'integer' 
    } 
    lines: { 
    collection: 'line', 
    via: 'invoice' 
    } 
} 

Linie-Modell:

attributes: { 
    name: { 
    type: 'integer' 
    } 
    invoice: { 
    model: 'invoice' 
    } 
} 

Wie Sie diese Modelle sehen habe eine Eins-zu-Viele-Beziehung. Alles funktioniert gut.

Aber jetzt will ich eine neue Rechnung und neue Linien erstellen mit dem Blueprint-API, die verbunden sind.

Die Dokumentation sagt, dass Sie einen neuen Datensatz erstellen können und fügen Sie ihn in eine bestehende mit diesem Schema: POST /:model/:id/:association/:fk

Aber es gibt nicht an, ob es möglich ist, zwei Datensätze gleichzeitig zu erstellen und sie in Verbindung bringen.

Weitere Details: Ich habe eine Rechnung und in dieser Rechnung können Sie Zeilen mit Produkten, deren Menge und anderen Dingen hinzufügen. Jetzt, wenn der Benutzer auf Speichern klickt, muss ich eine neue Rechnung und die neuen Zeilen erstellen und sie irgendwie zuordnen.

Sollte ich eine benutzerdefinierte Controller-Aktion für diese erstellen, oder überlege ich dies und ich sollte diese ganze Sache komplett anders machen?

Antwort

0

Um eine neue Rechnung mit neuen Linien zu schaffen ist möglich in SailsJS mit dem folgenden Code zu tun:

Invoice.create({number: 1, lines: [ 
    { 
    name: '1' 
    } 
]}) 

Dies wird eine neue Rechnung mit der Nummer 1 und schafft auch eine neue Zeile mit dem 1 Namen erstellen. Zeile 1 wird mit der Rechnung verknüpft. Da Linien eine Sammlung sind, können Sie sie als Array hinzufügen, so dass Sie mehr als eine Zeile zu Ihrer Rechnung hinzufügen können. Sie können Ihre Erstellungsfunktion im InvoiceController überschreiben und diesen Code hinzufügen.

Eine alternative Lösung ist die Verwendung von Promises.

npm install bluebird 

Setzen Sie den folgenden Code in der Spitze des Controllers

var Promise = require('bluebird'); 

Sie können den folgenden Code:: Stellen Sie sicher, dass Sie mit dem Befehl drossel installieren

createWithPromises: function(req, res){ 
var lineName = 1; 
var invoiceNumber = 2; 

Invoice.create({number: invoiceNumber}) 
    .then(function(result){ 
    Line.create({name: lineName, invoice: result}) 
    }) 
    .then(function(result){ 
    sails.log(result); 
    }) 

}

Zuerst erstellt es eine Rechnung mit der Nummer 2. Wenn erfolgreich, wird eine Linie erstellt, und als Parameter f oder Rechnung, geben Sie das Ergebnis Ihres vorherigen Erstellungsanrufs an. Für Informationen über Versprechen überprüfen http://bluebirdjs.com/docs/getting-started.html

+0

Leider funktioniert dies nicht. Dies ist die Standardmethode von SailsJS, die alle 'create' Anfragen bearbeitet. Außerdem habe ich es mit dem genauen Code in einer benutzerdefinierten Aktion ausprobiert und es funktioniert nicht. Wissen Sie zufällig, ob es anders geht? Die Rechnung wird erstellt, aber es sind keine Zeilen darin enthalten. – EinArzt

+0

Das ist komisch, bist du sicher, dass du deine create Funktion im InvoiceController überschrieben hast. Ich bearbeite meine Antwort für eine alternative Lösung mit Versprechungen. – Jordi