node.js - 续集:具有多态关系的 BelongsToMany 在第一次(成功)尝试后在范围上失败
问题描述
我们正在运行:
- NodeJS v13.11
- 续集 v5.22.3
- Postgres v11.7-2
我有 3 个模型,GameVersion、Tag 和 TagTaggable(代表关联实体)。一个 GV 可以有多个标签,一个标签可以与多个 GV(或通过 TagTaggable 的任何其他模型)关联。
模型是用这个构建的(没有显示在多态性之后要处理和清理的钩子):
游戏版本:
this.belongsToMany(models.Tag, {
through: {
model: models.TagTaggable,
unique: false,
scope: {
taggableType: 'game_version',
},
},
as: 'tags',
foreignKey: 'taggable_id',
constraints: false,
});
this.hasMany(models.TagTaggable, {
foreignKey: 'taggable_id',
scope: {
taggableType: 'game_version',
},
});
标签:
this.belongsToMany(models.GameVersion, {
through: {
model: models.TagTaggable,
unique: false,
scope: {
taggableType: 'game_version',
},
},
as: 'gameVersions',
foreignKey: 'tag_id',
constraints: false,
});
this.hasMany(models.TagTaggable, {
scope: {
taggableType: 'game_version',
},
});
标记可标记:
this.belongsTo(models.Tag, {
as: 'tag',
foreignKey: 'tag_id',
});
// Polymorphic relationships
this.belongsTo(models.GameVersion, {
foreignKey: 'taggable_id',
constraints: false,
as: 'gameVersion',
});
标签通过以下方式应用于 GV:
await gv.setTags(metadata.tags);
其中metadata.tags
是标签模型的集合。
这很完美,我第一次运行它时,我可以看到,调试到 SequelizeBelongsToMany.updataAssociations
方法的内部,通过查看 BelongsToMany 对象,第一次范围是正确的this.through.scope
。
我得到:
{taggableType: 'game_version'}
注意驼峰式的钥匙,它应该是这样的。
这将导致以下查询:
INSERT INTO "tag_taggable" ("taggable_type","created_at","updated_at","taggable_id","tag_id") VALUES ('game_version','2020-11-27 18:49:34.767 +00:00','2020-11-27 18:49:34.767 +00:00',82,29)
任何后续尝试都会出现问题(这意味着它在启动服务器后第一次工作,但在重新启动服务器之前的任何尝试都失败),我可以看到this.through.scope
现在导致:
{taggable_type: 'game_version'}
注意蛇形钥匙。
这将导致以下查询(注意缺少“taggable_type”列):
INSERT INTO "tag_taggable" ("created_at","updated_at","taggable_id","tag_id") VALUES ('2020-11-27 18:51:16.423 +00:00','2020-11-27 18:51:16.423 +00:00',83,29)
并引发“非空约束违规”。
这似乎是 Sequelize 的核心,但我无法想象它是否已经浮出水面(除非多态 m:n 真的不常见)。
有没有人有过这种经历,和/或任何人都可以阐明这里发生了什么?
我真的很想使用setTags
魔法方法,但我现在只是手动构建 TagTaggable 对象并将它们自己填充到数据库中。
TIA 提供任何见解/帮助,
克里斯
解决方案
推荐阅读
- cypress - 如何在 cypress 中对测试场景('it()')进行分组
- python - Celery:关于 celery.events.state.State 的一些问题
- openmaptiles - OpenMapTiles 是否支持离线使用?
- python - 仅当为 selenium python 添加 time.sleep 时,按钮单击才有效
- javascript - html 使活动侧边栏选项卡继续正文渐变颜色
- javascript - Eclipse 2020 Javascript 编辑器默认不工作
- angular - Angular 10/Ionic 5 - 将输入数据从模态传递到父组件
- regex - 正则表达式获取两个识别文本块之间的文本
- javascript - 在 Mapbox GL JS 中添加 WMS v 1.3.0
- php - 我想在 WPBakery 元素简码中更改 ::before 伪元素的样式