Подтвердить что ты не робот

Sails.js/Waterline cascading delete для ассоциации "многие-ко-многим"

Как показано в этом qaru.site/info/451921/..., без поддержки каскадирования (в частности, каскадных удалений) в Waterline существует обход для ассоциаций "один ко многим", используя обратный вызов жизненного цикла afterDestroy (или afterUpdate для soft-delete) и удаление связанных записей со вторым запросом. Это возможно через ManyModel.destroy({ oneModel: _.pluck(destroyedOneModels, "id") }) из afterDestroy.

Как мы это делаем для отношений "многие ко многим" (имея в виду, что таблица соединений используется внутри, и нам нужно удалять записи из нее)?

4b9b3361

Ответ 1

Я провел несколько тестов, используя Pet/User пример из документации с парусами 0.11.

Завершение этого обратного вызова жизненного цикла в модели Pet удаляет все users, связанные с Pet, прежде чем удалять его.

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

};

Я не смог бы сделать это в обратном вызове afterDestroy, потому что здесь отсутствуют отсутствующие свойства удаленных записей.

Водная линия автоматически удаляет записи таблицы соединений.

Проблема с этой функцией заключается в том, что она, вероятно, удалит слишком много вещей, если некоторые домашние животные поделятся некоторыми владельцами. Следуя примеру документации, если вы удалите домашнее животное Rainbow Dash, вы удалите пользователей Mike, Cody и Gabe, а домашние питомцы Pinkie Pie и Applejack станут сиротами.

Если вы определяете отношение "много-ко-многим", подобное этому, но вы знаете, что у домашних животных не может быть никакого общего владельца, тогда он работает нормально. В противном случае вы должны добавить тест, чтобы убедиться, что вы не станете другим домашним животным сиротой.