2013-10-07 2 views
8

Насколько я могу судить, используя Sequelizejs, похоже, что способ сохранения ассоциаций объектов при сохранении самого объекта не представляется возможным.Сохранить объект с ассоциациями в Sequelizejs

Например, у меня есть контакт, который может иметь 1 или более номер телефона. В настоящее время у меня есть что-то подобное для ассоциации:

global.db.Contact.hasMany(global.db.PhoneNumber, {as: 'phoneNumbers'}); 

Использования отдохнуть конечную точку я хотел бы, чтобы добавить новый объект контакта (с любыми предусмотренными номерами телефонов) и сохранить его в базу данных. Мой объект запроса выглядит примерно так:

{ 
    firstName: "john", 
    lastName: "Doe", 
    phoneNumbers: [ 
     { number: "555-555-5555", type: "home" } 
    ] 
} 

Сейчас я прохожу этот объект построить:

var contact = Contact.build(req.body); 

А потом позвонить сохранить (я знаю, что я мог бы использовать создать вместо сборки/сохранить, но у нас есть Собственная логика в сохранения для отслеживания измененных данных и которые пользователь сделал модификацию)

contact.save(); 

Это выдает следующее сообщение об ошибке, какой вид имеет смысл.

column "phoneNumbers" of relation "Contacts" does not exist 

Звонок в sql пытается установить значение столбца «phoneNumbers», которого не существует. Я, очевидно, не хочу, чтобы это делалось ... Я действительно хотел бы, чтобы навалом создавался каждый номер телефона в массиве с идентификатором создаваемого мной контакта.

Единственным примером, который я нашел, было следующее: https://gist.github.com/sdepold/3040391, и я действительно не хочу этого делать ... Поскольку я исхожу из конечной точки покоя, мне бы хотелось, чтобы это было сделано в целом (я имеют много моделей с ассоциациями). Мне также нужно будет делать эти операции навалом (для импорта контактов из других источников), поэтому я бы предпочел, чтобы это было минимальное количество вызовов sql. Кто-нибудь нашел хороший способ сделать это?

+0

У меня есть тот же вопрос. Вы нашли ответ на это? Я все еще на продолжении 1.7. – optimusPrime

+0

Я так и не нашел элегантного решения. С тех пор я перешел на другие проекты, которые не используют Sequelize. – Nova706

ответ

1

Я использую этот код

var createUser = function(req, reply) { 
    db.User.create(req.payload).success(function(user) { 
     saveGroups(req, reply, user); 
    }).error(function(err) { 
     console.error('Error occured', err); 
     reply('Error'); 
    }); 
}; 

var saveGroups = function(req, reply, user) { 
    db.UserGroup.destroy("user_id=" + user.id).success(function() { 
     var groups = req.payload.userGroups; 
     if (groups && groups.length > 0) { 
      for (var i = 0; i < groups.length; i++) { 
       groups[i].user_id = user.id; 
      } 
      db.UserGroup.bulkCreate(groups).success(function() { 
       reply(user); 
      }).error(function(err) { 
       console.error('Error occured', err); 
       reply('Error'); 
      }); 
     } else { 
      reply(user); 
     } 
    }).error(function(err) { 
     console.error('Error occured', err); 
     reply('Error'); 
    }); 
}; 
  • Пользователь является модель, которая hasMany UserGroup
  • req.payload приходит JSON
  • разрушающего (...) есть опустошить первые ассоциации (в случае если мы сделаем обновление)
Смежные вопросы