首页 > 解决方案 > 续集:具有多态关系的 BelongsToMany 在第一次(成功)尝试后在范围上失败

问题描述

我们正在运行:

我有 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 提供任何见解/帮助,

克里斯

标签: node.jspostgresqlsequelize.js

解决方案


推荐阅读