2014-12-23 16 views
12

Jak pokazano w tym stackoverflow answer mając żadnej pomocy dla kaskadowych (kaskadowy usuwa w szczególności) w linii wodnej jest obejście jeden do wielu związków przy użyciu wywołania zwrotnego cyklu życia i usunięcia skojarzonych rekordów cyklu życia z innym zapytaniem. Jest to możliwe poprzez od afterDestroy.Sails.js/KLW kaskadowy usunąć przez wiele-do-wielu związku

W jaki sposób robimy to dla relacji wiele-do-wielu (mając na uwadze, że tablica połączeń jest używana wewnętrznie i musimy usuwać z niej zapisy)?

Odpowiedz

7

Zrobiłem kilka testów używając Pet/User example from the documentation z żaglami 0.11.

Writting to cyklem życia zwrotnego w modelu Pet usuwa wszystkie users powiązanych z petprzed usuwania go.

// 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(); 
    }) 
    } 

}; 

nie mogłem zrobić to w zwrotnego afterDestroy cyklem ponieważ wiele-do-wielu właściwości usuniętych zapisów brakuje tam.

Linia wodna automatycznie usuwa zapisy tabeli połączeń.

Problem z tą funkcją polega na tym, że prawdopodobnie usunęłoby to zbyt wiele rzeczy, gdyby niektóre zwierzęta miały niektórych właścicieli. Idąc za przykładem dokumentacji, jeśli usunąć zwierzę Rainbow Dash, usuniesz użytkowników Mike, Cody i Gabe, a zwierzęta Pinkie Pie i Applejack byłoby sierot.

Jeśli zdefiniujesz relację wiele do wielu takich jak ta, ale wiesz, że zwierzęta nie mogą mieć żadnego właściciela wspólnego, to działa dobrze. W przeciwnym razie powinieneś dodać test, aby sprawdzić, czy nie uczynisz innego zwierzaka sierotą.