这是我的模特:
var Vote = sequelize.define('vote', {
title: {
type: Sequelize.STRING,
allowNull: false
},
description: {
type: Sequelize.TEXT
}
});
var Choice = sequelize.define('choice', {
choiceTitle: {
type: Sequelize.STRING,
allowNull: false
},
count: {
type: Sequelize.INTEGER,
length: 6
}
});
Choice.belongsTo(Vote);
Vote.hasMany(Choice, {onUpdate: 'cascade'});

以下是更新“投票”的代码。表格包括相关的选项'如果可能的话使用'投票' ' store()'的论点已经是投票的对象,其中包含更新的值,包括'选择'来自应用程序。
store(vote, callback) {
return Vote.findById(vote.id, {
include: [
{
model: Choice,
as: 'choices'
}
]
}).then(function(resVote) {
resVote.choices[0].updateAttributes({count: 120}) // just to test if at least it gets written to db
.then(function(res) {
callback(null, res);
}).catch((err) => callback(err, null));
});
},

仅供参考:在代码中我只是将特定选项的一个属性设置为120,只是为了看它是否在postgres-db中写下来,而且,万岁,这是有效的(感谢Jan Aagaard的回复在Updating attributes in associated models using Sequelize上至少有关联表的更新。)
我在Sequelize的文档中找不到解决方案(至少他们有一些)。当我尝试保存()','更新()'或者' upsert()'直接投票它只是创建一个带有空字段的全新行,如果允许null,或者如果不允许null就会失败。
更新表的所有(已更改)字段的推荐方法是什么?如果可能,还有Sequelize中的关联表?对不起,如果这个问题有点基础,但我现在很困难,没有找到明确的答案。
答案 0 :(得分:1)
您可以将include
obj传递给创建(请参阅http://sequelize.readthedocs.io/en/v3/docs/associations/上的“使用关联创建”),但看起来您不能使用更新。
我认为您要做的是使用关系访问器获取相关记录Sequelize为您提供并更新这些实例:
Vote.findById(vote.id)
.then(function(vote) {
return vote.getChoices()
})
.then(function(choices) {
return choices[0].update({ count: 120 })
})
.then(function(choice) {
callback(null, choice);
})
.catch(function(err) {
callback(err);
});
(I realise this means you lose the join and end up with two separate queries, but I can't think another way of doing this just now)