2015-03-06 3 views
1

Итак, у меня есть огромная проблема, и я не знаю, как исправить. У меня есть следующие настройки для моих книг:Sequelize save в нескольких таблицах

var Title = sequelize.define('title', { 
     id: DataTypes.INTEGER, 
     name: DataTypes.STRING, 
     organization_id: DataTypes.INTEGER 

    }, { 
     freezeTableName: true, 
     instanceMethods: { 
      retrieveAll: function (onSuccess, onError) { 
       Title.findAll({order: 'Rand'}, {raw: true}) 
        .ok(onSuccess).error(onError); 
      }, 
      retrieveById: function (quote_id, onSuccess, onError) { 
       Title.find({where: {id: quote_id}}, {raw: true}) 
        .success(onSuccess).error(onError); 
      }, 
      add: function (selectedCompetence,onSuccess, onError) { 

       var title = {id: null, name: this.dataValues.name, organization_id: this.dataValues.organization_id}; 
       Title.build(this.dataValues) 
        .save().ok(onSuccess).error(onError); 
      }, 
      updateById: function (quote_id, onSuccess, onError) { 
       var id = quote_id; 
       var quotes = this.quotes; 

       Title.update({quotes: quotes}, {where: {id: id}}) 
        .success(onSuccess).error(onError); 
      }, 
      removeById: function (quote_id, onSuccess, onError) { 
       Title.destroy({where: {id: quote_id}}).success(onSuccess).error(onError); 
      } 
     } 
    } 
), 
    Title_has_competence = sequelize.define('title_has_competence', { 
     id: DataTypes.INTEGER, 
     title_id: DataTypes.INTEGER, 
     competence_id: DataTypes.INTEGER, 
     competence_level_id: DataTypes.STRING 
    },{ 
     freezeTableName: true, 
     instanceMethods: { 
      retrieveAll: function (onSuccess, onError) { 
       Title_has_competence.findAll({order: 'Rand'}, {raw: true}) 
        .ok(onSuccess).error(onError); 
      }, 
      retrieveById: function (quote_id, onSuccess, onError) { 
       Title_has_competence.find({where: {id: quote_id}}, {raw: true}) 
        .success(onSuccess).error(onError); 
      }, 
      add: function (competence,onSuccess, onError) { 
       var ins = {id: null, title_id:competence.title_id, competence_id: competence.id, competence_level_id: competence.level}; 
       Title_has_competence.build(ins) 
        .save().ok(onSuccess).error(onError); 
      }, 
      updateById: function (quote_id, onSuccess, onError) { 
       var id = quote_id; 
       var quotes = this.quotes; 

       Title_has_competence.update({quotes: quotes}, {where: {id: id}}) 
        .success(onSuccess).error(onError); 
      }, 
      removeById: function (quote_id, onSuccess, onError) { 
       Title.destroy({where: {id: quote_id}}).success(onSuccess).error(onError); 
      } 
     } 
    }); 
Title.belongsToMany(Title_has_competence,{foreignKey: 'competence_id'}); 

В моей системе при создании заголовка вы проходите по массиву компетенции:

В этом случае компетентностей является массивом: selectedCompetence После того, как заголовок имеет был создан, мне нужно пройти через массив selectedCompetence и вставить их в таблицу Title_has_competence.

Я чувствую, что у меня есть litteraly, попробовал все от Hooks до мелких хаков, но ничего не сработало.

Может ли кто-нибудь нажать меня в правильном направлении?

вещи я попытался:

Title.build(this.dataValues) 
    .save().done(function(err, success, selectedCompetence){ 
     var i = 0; // here selectedCompetence is undefined 
    }); 

Title.build(this.dataValues) 
    .save(); 
Title.hook('afterCreate', function(success,selectedCompetence){ 
    var i = 0; // here selectedCompetence is an object with other values 
}) 

Title.create({id: null, name: this.dataValues.name, organization_id:this.dataValues.organization_id}).then(function(title, selectedCompetence) 
{ 
    var i = 0; // once again selectedCompetence is undefined 
}); 
+0

Какую версию Sequelize вы используете? Некоторые вещи немного изменились в последних версиях, например '.belongsToMany()' теперь требует атрибут 'through' ... –

ответ

2

Я думаю, что ближайшая попытка была then() подход. Но аргумент передается затем-функции после того, как create() - это только объект, который был только что создан, ничего другого, поэтому then(function(title, someCompetence) ... не будет работать.

Вы могли бы попробовать что-то вроде этого:

// Let's say you already know the competence IDs 
var competenceIds = [ 1, 2, 3 ] 

// First, create the title 
Title.create({ id: 1, name: 'Some Title' }) 
    .then(function(createdTitle) { 
    // Build an array of promises. Each element waits for one competence 
    // to be associated with the title. 
    var associationPromises = []; 
    competences.forEach(function(competenceId) { 

     // associate one competence with the title 
     associationPromises.push(Title_has_competence.create({ 
     title_id: createdTitle.id, 
     competence_id: competenceId, 
     competence_level_id: 123 // whatever else is on the join table 
     }) 
    }); 

    // Wait for all the competences to be associated before continuing 
    return Sequelize.Promise.all(associationPromises); 
    }); 

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

Но обычно Sequelize может обрабатывать много этого автоматически (см. documentation on Relations). Например, если вы имели только отношение Титульной компетентности, вероятно, можно просто написать:

var Title = sequelize.define(...) 
var Competence = sequelize.define(...) 
Competence.belongsToMany(Title, {through: 'title_has_competence'}); 
Title.belongsToMany(Competence, {through: 'title_has_competence'}); 

Title.create({name: 'Some Title'}).then(function(createdTitle) { 
    return createdTitle.setCompetences([1, 2, 3]); 
}); 

(примечание: Я на самом деле думаю, что Sequelize может обрабатывать ваше дело, но я не использовал эту функцию еще поиск «дополнительных атрибутов в вашей таблице соединений» в приведенной выше документации)

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