Работая с Sequelize реализовал следующую схему.
var Inbox = sequelize.define('Inbox', { /*defined realization here*/})
Inbox.hasMany(models.ItemTask, {
foreignKey: 'taskable_id',
constraints: false,
scope: {
taskable: 'inbox'
}
});
var ItemTask = sequelize.define('ItemTask', {
taskable: {
type: DataTypes.STRING
},
taskable_id: {
type: DataTypes.INTEGER
},
term: {
type: DataTypes.DATE
},
status: {
type: DataTypes.STRING
}
})
ItemTask.belongsTo(models.Inbox, {
foreignKey: 'taskable_id',
constraints: false,
as: 'inbox'
});
ItemTask.belongsTo(models.House);
var House= sequelize.define('House', {/*defined realization here*/})
House.hasMany(models.ItemTask);
// Создания задачи
router.post('/:id/task/', function(req, res) {
models.ItemTask.create({
term: req.body.termtask,
status: 'active',
// ...other
})
.then(function(itemtask){
models.House.findById(req.params.id) // <= Постоянно нахожу перед тем как вставлять
.then(function(house){
house.setItemTasks(itemtask) // <= наоборот работает нормально itemtask.setHouse(req.params.id) тут нету scope
.then(function(){
models['Inbox'].findById(req.body.inboxletter)
.then(function(inbox){
inbox.setItemTasks(itemtask)
// ↑↑↑ вот тут проблемы. Такой вариант работает и в scope попадает слово 'inbox', а вот на оборот itemtask.setInboxs(req.body.inboxletter) только id попадает, scope не учитывает.
.then(function(){
res.json({inbox, house, itemtask})
})
.catch(function(err){
console.log("Error: ", err)
}) // тут дикий promisehell
})
})
})
})
});
Также вместо Inbox есть еще десяток моделей которые должны попадать в эту таблицу задач.
Вопросы
1. Правильно ли организована схема работы с базой данных или можно поменять?
2. Как добавить scope в полиморфную модель в моем варианте?
3. Как избавится от promisehell? В перспективе будут транзакции.