2017-03-15 3 views
1

Meine Segel viele bis viele Verbände haben aufgehört, Änderungen zu speichern, das heißt, wenn ich eines der Elemente in meiner Checkbox-Liste abwählen, oder wählen Sie ein neues, die Änderungen werden nicht gespeichert (bevölkert zur Join-Tabelle).Segel viele bis viele Verbände nicht speichern

Früher hat es funktioniert, obwohl ich nicht sicher bin, wie lange es kaputt ist.

Alle anderen Felder auf der Seite werden korrekt gespeichert.

Also ich weiß, dass die Mechanik der meisten davon korrekt ist, nur die vielen zu vielen Verknüpfungen, dh die Liste der aktiven Datensätze in der Join-Tabelle zu aktualisieren.

Irgendwelche Hinweise darauf, was ich bei meinem Speichern falsch machen kann?

Ich habe folgende Modelle:

/** 
* User.js 
*/ 

module.exports = { 
    attributes: { 
     projects: { 
      collection: 'project', 
      via: 'users' 
     }, 
    } 

/** 
* Project.js 
*/ 

module.exports = { 

attributes: { 
    users: { 
     collection: 'user', 
     via: 'projects', 
     dominant: true 
    }, 
} 

In meiner Form I wie eine Checkbox-Liste zurückzukehre so

{ projectname: 'AS Story Database', 
    userlist: [ '10', '3', '1' ], <-- this line is the many to many line from the check boxs 
    projecttype: 'Development', 
    companyid: '1', 
    startdate: 'Sat Jan 01 2011 00:00:00 GMT+1100 (AUS Eastern Daylight Time)', 
    enddate: '' } 
} 

ich das Ergebnis

gesetzt
Project.findOne({'id':id}) 
    .populate('users') <--------- heres the populate I added but didnt seem to have effect 
    .exec(function(err,project){ 

versuchte bevöl Dies ist der Speicherdialog in meinem Segelcontroller

var a=req.param('project',null); 
    console.log(a); <-- note this is where the json above is output 
    project.projecttype= a.projecttype, 
    project.projectname= a.projectname, 
    project.companyid= a.companyid, 
    project.users= a.userlist, <-- this is the many to many association that used to work 
    project.startdate = a.startdate, 
    project.enddate = a.enddate 

    project.save(function(err,updated){ <-- here is the save function 
     if (err) { 
      req.session.flash = {'err':err}; 
      sails.controllers.project.edit(req,res); 
     }else{ 
      req.session.flash = {}; 
      res.redirect('project/index'); 
     } 
    }); 
+0

Sie Array zuweisen zu 'project.users' Variable anstelle von [' .ADD() ' ] (http://sailsjs.com/documentation/reference/waterline-orm/populated-values/add)/['.remove()'] (http://sailsjs.com/documentation/reference/waterline-orm/) bevölkerte Werte/entfernen). Hat es jemals so funktioniert? – Sangharsh

+0

Ja, tat es! Laut den Dokumenten ist dies die Art und Weise, wie es funktionieren soll. Obwohl ich zu dem Schluss komme, muss ich selbst einen tiefen Update-Mechanismus schreiben. –

+0

Können Sie bitte einen Link zu doc ​​bereitstellen, der sagt, dass 'project.users' direkt einem Array zugewiesen werden kann? – Sangharsh

Antwort

0

@Sangharsh ist in seinem Kommentar oben korrekt; Sie können eine Sammlung nicht aktualisieren, indem Sie ihr ein Array zuweisen und .save() aufrufen. Vielleicht denken Sie an .update(), was Ihnen in Sails v0.12.x die Möglichkeit gibt, ein Array von Objekten zu erstellen, die den bestehenden Satz ersetzen (obwohl dies in Sails 1.0 entfernt wurde, da es viele Bugs und Verwirrung verursacht hat).

Die korrekte Methode zum Aktualisieren der Sammlung einer vorhandenen Instanz in Sails v0.12.x besteht darin, die Methoden .add() und .remove() zu verwenden. Weitere Informationen finden Sie unter many-to-many associations doc page.

In Sails 1.0 wurde die .save() Methode der einzelnen Datensätze entfernt, um die Dinge klarer zu machen; Sie verwenden immer die Modellklassenmethoden .addToCollection(), .removeFromCollection() und .replaceCollection(), um mehrere Zuordnungen zu bearbeiten.

+0

Danke, ich glaube, ich wurde in ein falsches Gefühl der Sicherheit eingelullt durch die Tatsache, dass es eigentlich zuerst zu funktionieren schien. –

+0

Es sieht so aus, als ob die .replaceCollection() -Funktion in dieser Instanz ist. Ich dachte, die Zuweisung der Variablen mit einem Array war ein bisschen einfach, und ich war überrascht, dass es in erster Linie funktionierte. Dies ist die Arbeitsversion (ungetestet, sollte aber funktionieren): Project.replaceCollection (project.id, 'users', a.userlist) –

-1

Ok; Ich habe es endlich herausgefunden. Die obige Methode (replaceCollection) funktioniert nur mit älteren (0.x) Versionen von Segeln.

Um es in der modernen Version arbeiten, verwenden

<model>.update('id':<the recordID>},{'<association name>':<list of new records>}) 
.exec(function(err,updated){ 
    -do something- 
}); 

ie -

Project.update({'id':id},{'users': a.userlist}).exec(function(err,updated){ 
    project.save(function(err,updated){ 
     //console.log(updated); 
     if (err) { 
      console.log(err); 
      req.session.flash = {'err':err}; 
      sails.controllers.project.edit(req,res); 
     }else{ 
      req.session.flash = {}; 
      res.redirect('project/index'); 
     }; 
    }); 
}); 
+0

Dies ist rückwärts. 'replaceCollection' ist in Versionen von Sails <= 0.12.x nicht verfügbar und' .save() 'existiert in Sails 1.0 überhaupt nicht. Sie werden möglicherweise zwischen der Version von Sails, die in Ihrem Projekt installiert ist, und Ihrer globalen Sails-Version vertauscht. – sgress454

+0

Was Sie oben haben, sollte in Sails v0.12.x funktionieren, aber '.save()' ist unnötig; es macht nichts. Der '.update() 'Aufruf könnte funktionieren, aber es wird dringend empfohlen, dass Sie sich nicht auf" geschachtelte "Updates wie diese verlassen, da die Ergebnisse unterschiedlich sein können, abhängig davon, welche Art von Elementen Sie in diesem' userlist' Array haben sie sind nur Primärschlüsselwerte oder ganzes Objekt). Sie sollten stattdessen das Element mit '.findOne(). Populate()' abrufen und dann '.users.add()' und '.users.remove()' verwenden, um die Sammlung zu bearbeiten und dann '. save() 'um es zu erhalten. – sgress454

Verwandte Themen