2015-09-23 2 views
0

Я использую Sequelize.js для создания некоторых таблиц. Модели - это User, Shop, Role и ShopUserRoles.Создание ассоциаций между моделями

Я объявил модели в models/ папку вроде:

user.js

module.exports = function (sequelize, DataTypes) { 
    var User = sequelize.define('User', { 
     id : { 
      type: DataTypes.STRING, 
      unique: true, 
      primaryKey : true 
     }, 
     fullName : { 
      type: DataTypes.STRING, 
      field: 'full_name', 
      allowNull : false 
     }, 
    }, { 
     tableName: 'users', 

     classMethods: { 
      associate: function(models) { 
       User.hasMany(models.ShopUserRoles, {foreignKey: 'user_id' }); 
      } 
     }, 
     timestamps: true, 
     createdAt : 'created_at', 
     updatedAt : 'updated_at' 
    }); 

    return User; 
}; 

Shop.js

module.exports = function(sequelize, DataTypes) { 
    var Shop = sequelize.define('Shop', { 
     id : { 
      type : DataTypes.INTEGER, 
      unique : true, 
      primaryKey : true 
     }, 
     shopName : { 
      type : DataTypes.STRING, 
      field : 'shop_name', 
      allowNull : false 
     }, 
     status : { 
      type: DataTypes.STRING 
     } 
    }, { 
     tableName : 'shops', 

     classMethods : { 
      associate : function(models) { 
       Shop.hasMany(models.ShopUserRoles, {foreignKey : 'shop_id'}); 
      } 
     }, 
     timestamps : true, 
     createdAt : 'created_at', 
     updatedAt: 'updated_at' 
    }); 

    return Shop; 
}; 

Role.js

module.exports = function(sequelize, DataTypes){ 
    var Role = sequelize.define('Role', { 
     id : { 
      type: DataTypes.INTEGER, 
      unique: true, 
      primaryKey: true 
     }, 
     name : { 
      type: DataTypes.STRING, 
      unique: true 
     } 
    }, { 
     tableName : 'roles', 

     classMethods : { 
      associate : function(models) { 
       Role.hasMany(models.ShopUserRoles, {foreignKey: 'role_id'}); 
      } 
     }, 
     timestamps : true, 
     createdAt : 'created_at', 
     updatedAt: 'updated_at' 
    }); 

    return Role; 
}; 

ShopU serRoles.js

module.exports = function(sequelize, DataTypes) { 
    var ShopUserRoles = sequelize.define('ShopUserRoles', { 
    }, { 
     tableName : 'shop_user_roles', 

     classMethods: { 
      associate: function(models) { 
       ShopUserRoles.belongsTo(models.User, {foreignKey: 'user_id' }); 
       ShopUserRoles.belongsTo(models.Shop, {foreignKey : 'shop_id'}); 
       ShopUserRoles.belongsTo(models.Role, {foreignKey: 'role_id'}); 
      } 
     }, 
     timestamps : true, 
     createdAt : 'created_at', 
     updatedAt : 'updated_at' 
    }); 

    return ShopUserRoles; 
}; 

И я импортировал их в формате sequelize['import'](FILENAME) и добавлены соответствующие ассоциации.

Теперь, когда мы добавили ассоциации, таблица shop_user_roles должна быть создана ПОСЛЕ создания первых трех таблиц, иначе добавление внешнего ключа не будет работать. Тем не менее, я вижу, что Sequelize пытается создать эту таблицу до создания таблицы users. Чтобы исправить это, у меня есть три варианта:

  • Назначение ассоциации только после того, как таблиц созданы
  • Назначения явного упорядочения создания таблицы или пусть «фигуры» Sequelize вещи разумно
  • Попытки сделать (что неудобно, и я не хочу этого в коде разработки)

Что касается первых двух вариантов, я не совсем уверен, как это сделать с помощью Sequelize.js. Любые ссылки или помощь будут высоко оценены.

Я использую Sequelize.js v3.9.

ответ

0

Вот как мне удалось решить эту проблему. К сожалению, это попытка грубой силы.

В моем приложении я пытался экспортировать массив, содержащий имена моделей, сохраняя при этом правильный порядок. Хотя мы можем получить ассоциации между моделями, используя метод класса associate, также можно жестко закодировать серию создания таблицы внутри свойства моделей classMethods. Для User модели, которые могут быть как

classMethods: { 
    serial: 1, 
    associate: function(models) { 
     User.hasMany(models.ShopUserRoles, {foreignKey: 'user_id' }); 
    } 
} 

После этого простого рода на основе закодированного сериалу на массив, содержащий эти имена модели может сделать трюк.

Использование ассоциаций для создания топологического сорта также будет более приятным.

Смежные вопросы