sequelize-bundler v1.0.0
Sequelize Bundler - Models Management Made Easy
This utility allows you to select Sequelize models through a glob, import them through the Sequelize import method, run associations after all of them are imported (so import order does not matter) and then retrieve all of them through a single variable.
Here's how you do it:
const getBundledSequelizeModels = require('get-bundled-sequelize-models')
// remember, the param is a glob so you can match more complex directory/subdirectory structures
const appModels = getBundledSequelizeModels('path/to/my/models/**/*.js')
Here's an example user model:
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {}, {
tableName: 'Users'
})
// this will run after all models are imported, and you can reference any of
// them through the models argument passed to this method
User.associate = function (models) {
// add your associations here, a few basic examples...
models.User.hasMany(models.Posts)
models.User.hasMany(models.Comments)
models.Comments.belongsTo(models.User)
}
return User
}
Pro tip: model files can export multiple models, each with its own associations.
Here's an example user model file exporting multiple user types bound do the same database table (single table inheritance style):
module.exports = (sequelize, DataTypes) => {
const ProviderUser = sequelize.define('ProviderUser', {}, {
tableName: 'Users'
})
ProviderUser.associate = function (models) {
models.ProviderUser.belongsTo(models.ProviderOrganization)
}
const CustomerUser = sequelize.define('CustomerUser', {}, {
tableName: 'Users'
})
CustomerUser.associate = function (models) {
models.CustomerUser.belongsTo(models.CustomerOrganization)
}
return [ProviderUser, CustomerUser]
}
So there you have it. appModels
will now hold a reference to all the imported/initialized
Sequelize models, so you can pass it through in any context you need them.
And don't worry if you end up calling getBundledSequelizeModels('path/to/my/models/**/*.js')
multiple times in multiple places for some reason: if you call it with the same glob,
you'll get the cached models that were already initialised.
6 years ago