2015-02-25 3 views
2

Я интегрирую Sequelize в ActionHero. Мой инициализатор выполняет следующие действия:Загрузка ассоциаций в Sequelize

// configure the singleton 
api.sequelize.sequelize = new Sequelize(
    api.config.sequelize.database, 
    api.config.sequelize.username, 
    api.config.sequelize.password, 
    api.config.sequelize 
); 

// import models 
var dir = path.normalize(api.projectRoot + '/models'); 

fs.readdirSync(dir).forEach(function(file){ 
    var nameParts = file.split("/"); 
    var name = nameParts[(nameParts.length - 1)].split(".")[0]; 
    api.models[name] = api.sequelize.sequelize.import(dir + '/' + file); 
}); 

// import associations 
var dir = path.normalize(api.projectRoot + '/models/associations'); 

// ??? 

Вот пример модель в одном файле в/модели:

module.exports = function(sequelize, DataTypes) { 

    return sequelize.define(
    "Party", 
    { 
     id: { 
     type: DataTypes.BIGINT, 
     primaryKey: true, 
     autoIncrement: true 
     }, 
     name: { 
     type: DataTypes.STRING(256), 
     allowNull: false, 
     unique: true, 
     comment: "The legal name for the Party." 
     }, 
     dbaName: { 
     type: DataTypes.STRING(256), 
     comment: "The 'does business as' name for the Party." 
     } 
    }, 
    { 
     comment: "A Party is a person or group of persons composing a single entity with one or more roles in the system." 
    } 
) 

} 

Не знаю, как определить и загрузить ассоциацию в Sequelize. Я хотел бы иметь их в отдельных файлах и загружать после загрузки всех моделей, чтобы связать их вместе. Например, будет файл PartyOperator.js, который будет содержать связь между этими двумя объектами.

Что бы ??? раздел в инициализаторе и файл ассоциации с образцом?

ответ

3

В итоге я использовал подход ниже, потому что он поддерживает ассоциации с объектом (и файлом), с которым он связан. Когда открывается, например, модель партии в файле Party.js, вы видите как столбцы, так и любые отношения.

В инициализаторе ActionHero я сначала загружаю модели через import() Sequelize(), затем перебираю все загруженные модели и вызываю известный метод класса, называемый associate(), если он существует, для каждой модели для создания ассоциации.

// import models 
var dir = path.normalize(api.projectRoot + '/models'); 

api.log('loading models found in ' + dir, 'info'); 
var files = readdir.readSync(dir, ['**.js']); 
files.forEach(function(file) { 
    var pathArray = file.split('/'); 
    var name = pathArray[(pathArray.length - 1)].split('.')[0]; 
    api.log('importing models/' + file + ' as ' + name, 'info'); 
    api.models[name] = api.sequelize.sequelize.import(dir + '/' + file); 
}); 
api.log('running associations', 'info'); 

api.lodash.forEach(api.models, function(val, key) { 
    if(api.lodash.isFunction(val.associate)) { 
    val.associate(api.models); 
    } 
}); 

Вот пример модели:

sequelize.define(
    "Party", 
    { 
    id: { 
     type: DataTypes.BIGINT, 

     primaryKey: true, 
     autoIncrement: true 
    }, 
    name: { 
     type: DataTypes.STRING(256), 
     allowNull: false, 
     unique: true, 
     comment: "The legal name for the Party." 
    }, 
    dbaName: { 
     type: DataTypes.STRING(256), 
     comment: "The 'does business as' name for the Party." 
    } 
    }, 
    { 
    comment: "A Party is a person or group of persons composing a single entity with one or more roles in the system.", 
    classMethods: { 
     associate: function(models) { 
     models.Party.hasMany(models.Operator, {foreignKey: 'Party_operatorID'}); 
     } 
    } 
    } 
) 
Смежные вопросы