我遇到了类似的问题,但我使用的是 PostgreSQL。我发布我的解决方案,希望 Firebird 存在类似的解决方案(我个人没有使用过)。
正如您所提到的,当 Rails 执行测试套件时,它首先删除数据库表中的所有数据。在存在外键约束的情况下,这是很棘手的。理论上,处理这些约束的一种方法是找出删除记录的适当顺序。
然而,至少对于 PostgreSQL,Rails 实际上通过暂时禁用触发器来回避这个问题,否则可以防止违反这些外键约束。它使用以下(可能是特定于供应商的)SQL 命令对来执行此操作,在 DELETE 命令之前和之后执行:
ALTER TABLE tablename DISABLE TRIGGER ALL
ALTER TABLE tablename ENABLE TRIGGER ALL
有一个问题:只有超级用户角色(其中“角色”在上下文中基本上表示“用户”)可以执行这些命令。实际上,Rails 无法运行测试,除非它使用具有超级用户权限的 PostgreSQL 角色。也许 Firebird 也有超级用户?
给有此问题的 PostgreSQL 用户附注:
向用户授予超级用户(仅在您的测试或开发数据库上执行此操作)
运行这个SQL语句:ALTER USER myuser WITH SUPERUSER;
这是从 Rails 4.2.4 开始尝试在没有超级用户权限的情况下进行测试时出现的错误消息:
ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation:
错误:表“tablename”上的更新或删除违反了外键
约束
在 Rails 的未来版本中,将显示以下更具体的错误消息:
警告:Rails 无法禁用引用完整性。
这很可能是由于缺少权限造成的。
Rails 需要超级用户权限才能禁用引用完整性。
参见导轨/导轨提交 72c1557 and 公关#17726更多细节。