我有一个与其他模型相关的简单Sequelize模型。
module.exports = function (sequelize, DataTypes) {
var Votes = sequelize.define('Votes', {
isUpVote: DataTypes.BOOLEAN
}, {
classMethods: {
associate: function (models) {
Votes.belongsTo(models.Track);
Votes.belongsTo(models.User);
}
}
});
return Votes;
}
Sequelize会生成一个包含id
,TrackId
,UserId
和isUpVote
的表格。
我希望在UNIQUE
和TrackId
之间设置一个UserId
约束(即一个复合索引,确保给定的曲目和用户只有一条投票记录)。
如何做到这一点?
答案 0 :(得分:11)
你可以使用唯一约束并给它一个字符串而不是bool。然后另一个具有相同字符串的其他字段将成为同一个复合索引的一部分。
即:
module.exports = function (sequelize, DataTypes) {
var Votes = sequelize.define('Votes', {
isUpVote: {
type: DataTypes.BOOLEAN,
unique: 'myCompositeIndexName'
},
TrackId: {
type: DataType.INTEGER
unique: 'myCompositeIndexName',
},
UserId: {
type: DataType.INTEGER
unique: 'myCompositeIndexName',
}
}, {
classMethods: {
associate: function (models) {
Votes.belongsTo(models.Track);
Votes.belongsTo(models.User);
}
}
});
return Votes;
}
(^没有经过测试,只是在我的头顶!)
这个问题是这只会在创建表时发生。如果表已存在,则可以使用sequelize-cli的迁移功能实现此目的。
我真的希望这有助于其他方面至少指出你正确的方向。如果你仍然卡住了,我建议你去IRC频道进行续集,因为它看起来非常活跃。
答案 1 :(得分:2)
最终对我有用的是将其添加到indexes下,例如:
module.exports = function (sequelize, DataTypes) {
var Votes = sequelize.define('Votes', {
isUpVote: DataTypes.BOOLEAN,
}, {
indexes: [
{
unique: true,
fields: ['TrackId', 'UserId'],
},
],
classMethods: {
associate: function (models) {
Votes.belongsTo(models.Track);
Votes.belongsTo(models.User);
},
},
});
return Votes;
}