Bill
Bill

Reputation: 3209

sequelize.js N:M through relationships, delete cascade

I am using Sequelize.js v1.7.9. With Express.js 4

I have the following relationships:

User hasMany UserRoles
User hasMany Roles through UserRoles

UserRoles belongsTo user
UserRoles belongsTo role

Role hasMany UserRoles
Role hasMany Users through UserRoles

In Rails, we can simply say dependent: :destroy, and when either User or Role are deleted, the related UserRole rows are destroyed as well, however this is not working with Sequelize.js.

I am explicitly creating the join table with migrations, I've set the onDelete: 'CASCADE' on the join tables. But it is not behaving like it is supposed to.

TL;DR, How to get delete CASCADE to work like Rails ActiveRecord dependent: :destroy

My code is as of the following:

user.js:

module.exports = function (sequelize, DataTypes) {
  var user = sequelize.define('user',
    {
      name: DataTypes.STRING,
    },
    {
      classMethods: {
        associate: function (models) {
          user.hasMany(models.role, {through: models.userRole})
          user.hasMany(models.userRole, {onDelete: 'CASCADE', hooks: true})
        }
      }
    }
  )
  return user
}

role.js:

module.exports = function (sequelize, DataTypes) {
  var role = sequelize.define('role',
    {
      name: DataTypes.STRING,
    },
    {
      classMethods: {
        associate: function (models) {
          role.hasMany(models.userRole, {onDelete: 'CASCADE', hooks: true})
          role.hasMany(models.user, {through: models.userRole})
        }
      }
    }
  )
  return role
}

userRole.js:

module.exports = function (sequelize, DataTypes) {
  var userRole = sequelize.define('userRole',
    {
      userId: DataTypes.INTEGER,
      roleId: DataTypes.INTEGER,
    },
    {
      classMethods: {
        associate: function (models) {
          userRole.belongsTo(models.user)
          userRole.belongsTo(models.role)
        }
      }
    }
  )
  return userRole
}

Thanks

Upvotes: 3

Views: 2565

Answers (1)

Jan Aagaard Meier
Jan Aagaard Meier

Reputation: 28798

Unfortunately n:m cascades do not work properly in 1.7. They are added by default in 2.0

Upvotes: 3

Related Questions