Ruby on Rails 使用外键删除固定装置

2023-11-23

我在使用使用外键的装置设置测试时遇到问题!如果有人能帮助我理解这一点,我将不胜感激。

比方说:user_type模型有一个参考:role模型,当测试执行时,测试数据库中的所有数据都被删除并再次重新插入,Rails 首先从角色模型中删除数据,而不是先从角色模型中删除数据:user_type然后才从:role.

赛程:

#roles.yml
technical:
  name: 'Technical'
  obs: 'User Role for technical / maintenance users!'


#user_types.yml
technic:
  role: technical
  name: 'Technic'
  is_admin: true

测试:

#app/test/models/role_test.rb
require 'test_helper'

class RoleTest < ActiveSupport::TestCase
  fixtures :roles

  test 'save Role without name' do
    data = Role.new()
    data.valid?
    assert data.errors.added?(:name, :blank), 'Role saved without name!'
  end
end


#app/test/models/user_type_test.rb
require 'test_helper'

class UserTypeTest < ActiveSupport::TestCase
  fixtures :user_types

  test 'save User Type without role_id' do
    data = UserType.new(:name => 'public')
    data.valid?
    assert data.errors.added?(:role_id, :blank), 'User Type saved without role'
  end
end

当测试第一次运行时,一切顺利。 Rails 清理数据库(此时仍然是空的,因此不存在违反约束的情况),然后插入来自装置的数据,并且测试运行良好。 下次我尝试运行测试时,它们将失败,因为当 Rails 开始从数据库中删除数据时,它会从角色模型/表而不是 user_type 开始!因为在这些模型上定义的外键会发生冲突,因为 user_type 仍然引用模型表中的数据!

这应该如何正确完成? 是否有任何机制告诉 Rails 销毁夹具数据的顺序?顺便说一句,我正在使用 RubyOnRails 4 和 Firebird 2.5。

我已经为此苦苦挣扎了几天,但我一直没能做到这一点!

先感谢您!


我遇到了类似的问题,但我使用的是 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更多细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby on Rails 使用外键删除固定装置 的相关文章

随机推荐

  • Django TestCase 不使用辅助数据库上的事务

    我正在使用 Django 1 3 1 我有两个数据库 我的一些模型位于一个数据库中 一些模型位于另一个数据库中 这两个数据库都是 contrib gis db backends postgis 数据库 令我惊讶的是 Django 的 Tes
  • GWT:如何避免在生成的JavaScript代码中调用dynamicCast和canCastUnsafe?

    我正在用 Java 编写一些特殊用途的数据结构 旨在在浏览器中使用 使用 GWT 编译为 JavaScript 我正在尝试匹配一些内置 JDK 类的性能 我注意到运行速度相当快 但是当我将我的代码跟踪与一些模拟的 JDK 代码进行比较时 我
  • 使用 HTML/JavaScript 检测本地文件拖放

    有一个 HTML 文本区域 我能够在以下情况下捕获该事件 本地文件被拖放到文本区域上 但如何获取删除的文件名 最后修改并插入到文本区域中 在这种情况下 以下表达式返回 None event dataTransfer files event
  • 如何使用 Access/VBA 复制到剪贴板?

    在 Access 2003 2007 中使用 VBA 如何将字符串变量的内容复制到剪贴板 这个网站建议创建一个零长度的文本框 将字符串复制到文本框 然后运行DoCmd RunCommand acCmdCopy 啊 我的意思是 我们可以沿着这
  • C# 中是否可以合并 string 和 DBNull?

    我正在编写一个 C 例程来调用存储过程 在我传入的参数列表中 其中一个值可能合法地为空 所以我想我会使用这样的行 cmd Parameters Add new SqlParameter theParam theParam DBNull Va
  • PHP 将一个类的实例传递给另一个类

    我对 PHP OO 编程技术还是比较陌生 我有一个非常简单的广泛问题 在类中实例化一个类然后将该实例传递给另一个类通常是不好的做法吗 我想要的是能够创建我知道在每个用户请求中始终需要的特定类的实例 第二类不仅仅是一个辅助类 理想情况下在我的
  • java:为什么局部变量应该声明为final [重复]

    这个问题在这里已经有答案了 可能的重复 在Java中将方法参数声明为final是否有任何性能原因 为什么在 Java 中将局部变量和方法参数标记为 final 我正在使用 PMD 来查看代码违规情况 在 webService 方法中 我有下
  • C# 如何检查两个值之一是否为 TRUE?

    对于 C 专家来说这应该是一个简单的问题 我基本上想检查一个值或另一个值是否为 TRUE 代码如下 if Boolean Parse staff getValue Male Boolean Parse staff getValue Fema
  • 更改 DataGridView 中按钮的颜色

    我到处寻找这个问题的答案 这篇文章的答案 更改 DataGridView 单元格中按钮的颜色没有回答我关于字体的问题 我已经尝试过以下方法 DataGridViewRow r dataGridView Rows 0 r Cells 1 St
  • 用于 PHP 的 Microsoft sqlsrv 驱动程序在查询“SELECT SCOPE_IDENTITY() AS id”时不返回任何结果

    使用 php mssql 驱动程序 此查询工作正常 INSERT INTO Table columnName VALUES text SELECT SCOPE IDENTITY AS id 表确实有一个 id 列 它是一个标识 我将执行该查
  • MVC - 模型与同一页面上的多个实体绑定

    我想知道如何在从页面上多个实体返回信息的场景中使用模型绑定 我想显示来自两个单独实体的字段组合 即客户 地址 我正在为我的模型使用 Microsoft 的 DAAB 和自定义业务实体 有任何想法吗 如果您尝试在回发时绑定到多个模型 则应尝试
  • 如何在 MS SQL Server 2008 上设置日期格式

    我想根据模式格式化日期 例如 22 01 2015 或 2016 12 15 在 NET Framework 中 我们有 DateTime gt ToString 方法 它接受格式作为参数 甚至接受 string Format 它的作用相同
  • 在 Web 应用程序中处理时区

    在我们的网络应用程序中 我们需要显示并输入 不同时区不同国家的日期时间信息 目前 我们正在为每个国家 地区维护单独的 Web 服务器和单独的数据库 oracle 11g 我们计划将所有内容合并到一个具有单一数据库 Oracle 11g 的门
  • 如何在此 SSRS 表达式中“指定数据集聚合”?

    我的 SSRS 报告中需要一个行值 该值是根据报告中已使用的几个字段计算得出的 我希望它显示在名为 textboxPercentageValue 的文本框中 用半简单的英语来说 表达式 公式是 If the value of the Wee
  • Android 自定义 ArrayAdapter 在过滤后不刷新

    所以我有一个习惯ArrayAdapter所以我可以使用标题 副标题视图ListView 我有一个EditText它接受一个字符串并过滤适配器 过滤器的工作原理是过滤正确的对象 我可以通过单击它来判断 它以正确的 附加 开始意图 但是 即使过
  • Javascript:关于如何定义新数据类型有哪些指导原则?

    假设您正在创建数据类型并公开其行为 您能否举例说明何时使用 一个功能和新功能 define new data type var CustomDataType function this a whatever this doX functio
  • 设置内联元素的宽度

    您可以设置内联元素的宽度 例如 span em and strong 但在放置它们之前您不会注意到任何效果 a 我以为内联元素的宽度不能设置 b 假设可以设置宽度 在我们定位内联元素之前 我们不会注意到任何效果 因此我们指定的宽度 位置如何
  • “撤消”功能的最佳设计模式[重复]

    这个问题在这里已经有答案了 可能的重复 撤消引擎的设计模式 一般来说 您如何处理应用程序中支持 撤消 功能的问题 我曾经开发过网络应用程序和桌面应用程序 但我从来没有真正对我制作的任何 撤消 系统感到满意 我相信应该是Command设计模式
  • Angular2.js 与 Angular2.dev.js

    我想知道之间的差异angular2 js and angular2 dev js 当然还有更多文件 例如 router dev js and router js还有 我的问题是为什么有两个版本 它们之间有什么区别 angular2 dev
  • Ruby on Rails 使用外键删除固定装置

    我在使用使用外键的装置设置测试时遇到问题 如果有人能帮助我理解这一点 我将不胜感激 比方说 user type模型有一个参考 role模型 当测试执行时 测试数据库中的所有数据都被删除并再次重新插入 Rails 首先从角色模型中删除数据 而