使用 Sequelize 实现单表继承

unf*_*res 3 sti node.js sequelize.js

有没有办法使用 sequelize 创建单表继承?

我想要一个用于购买和部分购买模型的 STI,其中我会有一个类型字段,它是“购买”或“部分购买”以及类购买和部分购买,它们每个都继承自一个操作类。

我不认为 sequelize 支持这一点,但是可以实现吗?

ian*_*ler 5

嘿,所以我知道您在合理的时间内没有得到答案,但是您可以像您所说的那样使用数据库中的枚举类型列,然后使用 sequelize 的范围功能。Scope 涵盖从查询到模型定义和关联的所有领域。效果很好。我为带有请求和响应的消息表实现了类似的功能。

module.exports = function(sequelize, DataTypes) {
  var Message = sequelize.define('Message', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER,
    },
    type: {
      type: DataTypes.ENUM('REQUEST', 'RESPONSE', 'FILE'),
      allowNull: false
    },
    text: {
      type: DataTypes.TEXT,
      allowNull: false,
    },
    state: {
      type: DataTypes.JSONB,
      allowNull: true,
    },
    userTeamId: {
      type: DataTypes.INTEGER,
      allowNull: false,
    }
  }, );
  Message.associate = (models) => {
    Message.belongsTo(models.UserTeam, { foreignKey: 'userTeamId', targetKey: 'tag'})
  }
  return Message;
};
Run Code Online (Sandbox Code Playgroud)

然后这就是我做关联的方式。

module.exports = function(sequelize, DataTypes) {
  var UserTeam = sequelize.define('UserTeam', {
    tag: { type: DataTypes.UUID, allowNull: false, unique: true},
    active: { type: DataTypes.BOOLEAN, defaultValue: false },
    activationNonce: { type: DataTypes.STRING },
    UserId: { type: DataTypes.INTEGER, },
    TeamId: { type: DataTypes.INTEGER, },
    type: DataTypes.ENUM('OWNER', 'ADMIN', 'MEMBER', 'GUEST'),
  },);
  UserTeam.associate = (models) => {
    UserTeam.hasMany(models.Message, { as: 'responses', foreignKey: 'userTeamId', sourceKey: 'tag', scope: {type: 'RESPONSE'}})
    UserTeam.hasMany(models.Message, { as: 'requests', foreignKey: 'userTeamId', sourceKey: 'tag', scope: {type: 'REQUEST'}})
    UserTeam.hasMany(models.Message, { as: 'files', foreignKey: 'userTeamId', sourceKey: 'tag', scope: {type: 'FILE'}})
    UserTeam.hasOne(models.Team, {foreignKey: 'id', sourceKey: 'TeamId'})
    UserTeam.belongsTo(models.User, {foreignKey: 'UserId', sourceKey: 'id'})
  }
  return UserTeam;
};
Run Code Online (Sandbox Code Playgroud)

关联的好处在于,您可以使用 UserTeam 的实例(如“userteam.getFiles()”)来获取所有关联文件。

  • 甜的。谢谢你的好例子。我想知道这是否可以被子类化。对于消息来说有点人为,但是例如。UserMessage、SystemMessage 等假设它们具有不同的功能域。 (3认同)