@cbolota

Как улучшить работу с базой данных через — Sequelize?

Работая с 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? В перспективе будут транзакции.
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы