2014-12-23 17 views
12

Wie in diesen stackoverflow answer gezeigt, zur Kaskadierung keine Träger (Cascading insbesondere Löschungen) in der Wasserlinie gibt es eine Abhilfe für one-to-many Verbände Verwenden Sie den Lebenszyklus-Callback afterDestroy (oder afterUpdate für Soft-delete) und löschen Sie die zugeordneten Datensätze mit einer zweiten Abfrage. Dies ist über innerhalb von afterDestroy möglich.Sails.js/Wasserlinie für eine Kaskadierung many-to-many Assoziation löscht

Wie machen wir das für eine Viele-zu-Viele-Beziehung Beziehung (unter Berücksichtigung, dass eine Junction-Tabelle intern verwendet wird und wir Datensätze daraus löschen müssen)?

Antwort

7

Ich habe einige Tests mit der Pet/User example from the documentation mit Segeln 0,11.

Writting dieses Lebenszyklus Callback im Pet Modell löscht alle users zu einem pet zugeordnet vor sie zu löschen.

// models/Pet.js 
module.exports = { 

    attributes: { 
    name:'string', 
    color:'string', 
    owners: { 
     collection: 'user', 
     via: 'pets' 
    } 
    }, 

    beforeDestroy: function(criteria, cb) { 
    // Destroy any user associated to a deleted pet 
    Pet.find(criteria).populate('owners').exec(function (err, pets){ 
     if (err) return cb(err); 
     pets.forEach(function(recordToDestroy) { 
     User.destroy({id: _.pluck(recordToDestroy.owners, 'id')}).exec(function(err) { 
      console.log('The users associated to the pet ' + recordToDestroy.name + ' have been deleted'); 
     }); 
     }); 
     cb(); 
    }) 
    } 

}; 

konnte ich nicht tun es in der afterDestroy Lifecycle-Rückruf, weil die many-to-many Eigenschaften der gelöschten Datensätze dort fehlen.

Waterline löscht die Datensätze der Junction-Tabelle automatisch.

Das Problem mit dieser Funktion ist, dass es wahrscheinlich zu viele Dinge löschen würde, wenn einige Haustiere einige Besitzer teilen. Nach dem Beispiel der Dokumentation, wenn Sie das Tier Rainbow Dash löschen, müssen Sie die Benutzer Mike, Cody und Gabe, und die Tiere Pinkie Pie und Applejack löschen würde Waisen sein.

Wenn Sie eine Viele-zu-Viele-Beziehung wie diese definieren, aber Sie wissen, dass die Haustiere keinen Eigentümer gemeinsam haben können, dann funktioniert es gut. Andernfalls sollten Sie einen Test hinzufügen, um zu überprüfen, ob Sie ein anderes Haustier nicht zu einem Waisenkind machen.