2014-11-26 2 views
3

Я создал свои модели для продолжения. У меня есть модель User, которая прикрепляется как объект Address. Ссылки определяются как таковые:Sequelize, сохранить объект вместе с дочерним (связанным) объектом

User.hasMany(Address); 

Address.belongsTo(User); 

Объект Я пытаюсь магазин имеет правильную структуру с ребенком прикрепленную:

{ 
     Username: "John", 
     Email: "[email protected]", 
     Address: [{ 
      street: "somestreet" 
     }] 
    }; 

При попытке создать объект, родительский элемент вставлен в моя база данных, но выходит приложение с [объект sequelize] не содержит метод .save()

я создаю следующим образом:

User.create(user).success(function(user){ 

}); 

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

+0

Не должно быть «Адрес: [{street:« somestreet »}]' согласно этой декларации? Многие, а не одни. – Wrikken

+0

@JanR вы могли создать дочерний экземпляр, используя написанный выше код? – sunitj

+0

Да, убедитесь, что вы передали его в виде массива [] – JanR

ответ

1

ОКАЗЫВАЕТСЯ оригинальный комментарий по Wrikken был правильным, я проходил в подошве объект, а не массив.

Это зафиксировал его:

{ 
     Username: "John", 
     Email: "[email protected]", 
     Address: [{ 
      street: "somestreet" 
     }] 
    }; 
0

Я не думаю, что вы можете создать связанный объект, подобный этому.

Другие вещи: Вам больше не следует использовать обработчик успеха. Пользователь .then, .catch и .finally.

Я предполагаю, что у вас есть первичный ключ userId для вашей модели User. В противном случае замените userId на ваш первичный ключ, который может быть Username.

Вы должны сделать:

var user = { 
    Username: "John", 
    Email: "[email protected]" 
}; 

User.create(user).then(function(user) { 
    // sequelize passes the newly created object into the callback, 
    // and we named the argument "user". 
    // "user" is now a sequelize instance that has the association 
    // methods of add[AS]. So we use it. 

    var address = Address.build({ 
     street: "somestreet" 
    }; 
    return user.addAddress(address); 
}).then(function(address){ 
    //do something with address? 
}).catch(function(err){ 
    //do something with your err? 
}); 

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

User.create(user).then(function(user) { 
    var address = { 
     street: "somestreet" 
     userId: user.userId 
    } 
    return Address.create(address); 
}).then(function(address){ 
    //do something with address? 
}).catch(function(err){ 
    //do something with your err? 
}); 
0

Вы также можете использовать ключевое слово include так:

const user = { 
    Username: "John", 
    Email: "[email protected]", 
    Address: [ 
    { 
     street: "somestreet" 
    } 
    ] 
} 

User.create(user, { 
    include: [models.address] 
}) 
.then((createdUser) => { 
    // ... 
}) 

Где models это объект, который содержит все ваши модели Sequelize и их объединений.

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