2015-03-24 3 views
1

я не был вполне уверен, что назвать этот вопрос, но здесь моя установка:сохранение sequelize несколько объектов, которые assosiates

var AcademyModule = sequelize.define('academy_module', { 
    academy_id: { 
     type: DataTypes.INTEGER, 
     primaryKey: true 
    }, 
    module_id: { 
     type: DataTypes.INTEGER, 
     primaryKey: true 
    }, 
    module_module_type_id: DataTypes.INTEGER, 
    sort_number: DataTypes.INTEGER, 
    requirements_id: DataTypes.INTEGER 
}, {freezeTableName: true,} 

Со следующим assosiation:

Requirements = sequelize.define('requirements', { 
    id: DataTypes.INTEGER, 
    value: DataTypes.STRING, 
    requirement_type_id: DataTypes.INTEGER 
}, {freezeTableName: true}); 

AcademyModule.belongsTo(Requirements, {foreignKey: 'requirements_id'}); 

Теперь, как вы можете видеть из моего table мне нужно было бы сохранить строку в таблице requirements, а затем использовать вставленный id для вставки в таблицу academy_module.

для этого я создал следующее:

add: function (requirements,academyModule,onSuccess, onError) { 
    var academyModule = academyModule; 
    if(requirements == null) { 
     AcademyModule.build(this.dataValues) 
      .save().ok(onSuccess).error(onError); 
    } else { 
     if(requirements.requirement_type_id == '1') { 
      requirements.value = requirements.module.id; 
     } 
     Requirements.create(requirements).then(function(createdReq) { 
      var associationPromises = []; 
      associationPromises.push(AcademyModule.create(this.dataValues)); 

      return sequelize.Promise.all(associationPromises); 
     }).success(onSuccess).error(onError); 
    } 
} 

Однако в функции then я неспособен достигнуть academyModule объект, который содержит значения, которые должны быть вставлены.

Это повторяющаяся проблема для меня, и я действительно хочу знать, как можно соединить так, что они делают это автоматически, не делая небольшой hacks

я разведку в документации, но я havnt смог найти один пример выше (который я нашел довольно странное, видя, как это довольно нормальная ситуация)

метод Яна

Я пытался решить, используя изящный метод Яна

Однако я получаю сообщение об ошибке сказав:

academy_module is not associated to requirements! 

Мой код выглядит так, как сейчас:

var academyModule = academyModule; 
if(requirements == null) 
{ 
    AcademyModule.build(this.dataValues) 
     .save().ok(onSuccess).error(onError); 
} 
else 
{ 
    requirements.academy_module = academyModule; 

    Requirements.create(requirements, { 
     include: [AcademyModule] 
    }); 
} 

Забавная вещь здесь т шляпа у меня есть Ассоциация:

AcademyModule.belongsTo(Requirements, {foreignKey: 'requirements_id'}); 

Requirements.hasOne(AcademyModule, {foreignKey: 'requirements_id'}); 

ответ

1

Прежде всего, я не могу ответить, почему у вас возникают проблемы с доступом к academyModule - он должен быть доступен с помощью простого обзора javascript.

Есть некоторые необъяснимые биты вашего кода ... Вы подталкиваете одно обещание к associationPromises - Почему бы просто не вернуть это обещание?

Доступ к this.dataValues для создания экземпляра AcademyModule -обычно не определено внутри обработчика обещаний.

Ваша проблема может быть решена более элегантно с вложенным созданием, которое находится в версии 2.0.5: https://github.com/sequelize/sequelize/pull/3386

Прежде всего, вам нужно создать обратную связь от требований -> AcademyModule

Requirements.hasOne(AcademyModule, {foreignKey: 'requirements_id'}); 

Это необходимо потому, что требование является «основной моделью», которая используется для создания AcademyModule

requirements.academy_module = academy_module; 

Requirements.create(requirements, { 
    include: [AcademyModule] 
}); 

устанавливая academy_module от требований объекта и добавления include в качестве 2-го параметра (аналогично тому, как вы используете включает в find), как создаются и попка в одно время.

Вам нужно будет немного изменить свои модели. При определении текущей модели таблица будет содержать столбец id, но продолжение не знает, что это первичный ключ. Вам придется либо полностью удалить идентификатор из модели требований (в этом случае sequelize добавит его автоматически и пометить его как первичный ключ), или добавить primaryKey к нему:

id: { 
    type: DataTypes.INTEGER, 
    primaryKey: true, 
    autoIncrement: true // optional - only if you actually want AI :) 
} 
+1

Эй @Jan прежде всего поблагодарить Вас за Ответ: Я пытаюсь решить это, используя ваш элегантный способ, но я получаю проблему с обновлением ive, мой ответ мог бы вы взглянуть :)? –

+0

Вам необходимо настроить обратную связь (Требования hasMany/hasOne AcademyModule) –

+0

ive udated мой код, чтобы вы могли видеть требования, добавленные в него, все еще не добавляются (однако после внесения изменений он вставляет в таблицу требований) –

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