Sequelize.js по-прежнему удаляет строку таблицы, даже если для параметра paranoid установлено значение true

Мне не удается заставить Sequelize.js мягко удалить строки в моей таблице. Я использовал Sequelize cli для выполнения всех своих миграций, и я не использую функцию синхронизации для повторной синхронизации базы данных при запуске. У меня есть поля временной метки и даже поле deletedAt в моей миграции и моделях (модель также имеет paranoid: true), и независимо от того, что она по-прежнему удаляет строку вместо добавления метки времени в поле deletedAt. Я заметил, что когда выполняются какие-либо запросы, он не добавляет удаленное значение = NULL в запрос, как я видел в некоторых руководствах. Я использую Sequelize.js v3.29.0.

Файл модели:

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Collection = sequelize.define('Collection', {
    userId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      validate: {
          isInt: true
      }
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false
    },
    description: DataTypes.TEXT,
    createdAt: {
        allowNull: false,
        type: DataTypes.DATE
    },
    updatedAt: {
        allowNull: false,
        type: DataTypes.DATE
    },
    deletedAt: {
        type: DataTypes.DATE
    }
  }, {
    classMethods: {
      associate: function(models) {
        Collection.belongsTo(models.User, { foreignKey: 'userId' })
      }
    }
  }, {
    timestamps: true,
    paranoid: true
  });
  return Collection;
};

Файл миграции:

'use strict';
module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.createTable('Collections', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      userId: {
        allowNull: false,
        type: Sequelize.INTEGER
      },
      name: {
        allowNull: false,
        type: Sequelize.STRING
      },
      description: {
        type: Sequelize.TEXT
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      deletedAt: {
          type: Sequelize.DATE
      }
    });
  },
  down: function(queryInterface, Sequelize) {
    return queryInterface.dropTable('Collections');
  }
};

Вот код контроллера, который я использую для уничтожения объекта коллекции.

Collection.findOne({
        where: {
            id: collectionId,
            userId: user.id
        }
    }).then(function(collection){
        if (collection !== null) {
            collection.destroy().then(function(){
                res.redirect('/collection');
            }).catch(function(error){
                res.redirect('/collection/'+collectionId);
            });
        }
    });

person bach942    schedule 19.04.2017    source источник


Ответы (1)


Убедитесь, что атрибут paranoid определен во втором параметре объекта.

..., {
classMethods: {
    associate: function(models) {
        Collection.belongsTo(models.User,{ foreignKey: 'userId' })
      }
  },
    timestamps: true,
    paranoid: true
}

Вы определили параноик как 3. Param, и в этом проблема.

person djra    schedule 19.04.2017
comment
Большое спасибо. Я не осознавал, что параметры уровня класса находятся в том же месте, что и classMethods и instanceMethods на 2-м уровне определения модели. - person bach942; 20.04.2017