Rails 对 :dependent => :destroy 和级联删除/无效/限制做什么

2024-04-23

我正在尝试决定如何最好地为我的 Rails 应用程序设置(如果有的话)外键约束。我有一个模型Response that belongs_to a Prompt。我想用:dependent => :destroy摧毁每一个Response属于已删除的Prompt我正在尝试决定应该对外键施加什么删除约束。

简而言之,我想要关于如何最好地利用依赖对象上的 destroy 方法和外键约束的建议,以确保 cruft 不会累积并反映所存储数据的逻辑结构。几个早期的问题,例如我应该使用 ON DELETE CASCADE、 :dependent => :destroy 还是两者都使用? https://stackoverflow.com/questions/1189970/should-i-use-on-delete-cascade-dependent-destroy-or-both and Rails:删除级联与依赖销毁 https://stackoverflow.com/questions/12556614/rails-delete-cascade-vs-dependent-destroy?rq=1问哪个更好,但他们并没有真正说明这两个选择如何相互作用以及它们以什么顺序触发,或者在这一点上似乎很模糊。

在我看来,这些考虑因素似乎分为几个部分:

  1. Does :dependent => :destroy在从数据库中删除父对象之前,首先对依赖对象调用 destroy,因此即使我使用级联删除,仍会在这些对象上调用 destroy 吗?
  2. Does :dependent => :destroy在从数据库中删除父对象之前(或在事务中)从数据库中删除依赖对象?换句话说,如果我将级联设置为无效,数据库最终会在子对象被删除之前浪费地无效化子对象上的引用吗?

  3. 删除是否是由于原始销毁和链接而发出的:dependent => :destroy选项包含在事务中,或者如果我不设置级联删除,不幸的是定时崩溃会在数据库中留下痕迹吗?

  4. 终于会:dependent => :destroy如果我使用限制作为外键 on_delete 选项,确保从数据库中删除父对象?

With dependent: :destroy在事务中,rails 首先销毁所有依赖项,然后才删除记录本身。

可能存在竞争条件:如果在 Rails 读取集合以进行销毁之后添加了依赖记录,但尚未删除父记录 - 它可能会被遗留下来。下面我们将这些称为“竞争条件记录”。

  1. 是的,你可以使用dependent: :destroy and on delete cascade,这样可以删除一些子项(竞争条件的子项)而无需回调。如果回调是强制性的 -on delete restrict结合一些锁定和显式子项删除可能会更好。 这有点像validates :some_field, uniqueness: true最好有唯一索引作为支撑,只有数据库本身才能保证数据的一致性。

  2. 由于父级最后被删除,on delete nullify不会妨碍(你会得到无效的竞争条件记录)

  3. 有事务包装所有删除,只能留下竞争条件记录

  4. on delete restrict over dependent: :destroy只会针对竞争条件记录触发(并回滚整个事务),但如果没有竞争条件 - Rails 会很乐意删除所有内容。

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

Rails 对 :dependent => :destroy 和级联删除/无效/限制做什么 的相关文章

  • Rails - 使用delayed_job异步发送所有电子邮件

    我在用着延迟作业 https github com collectiveidea delayed job我对此非常满意 尤其是workless https github com lostboy workless扩大 但我想这样设置ALL我的
  • RSpec 抛出分段错误

    有时我的测试套件会无缘无故地抛出分段错误 这是输出 Users Test rvm gems ruby 1 9 3 p392 gems activerecord 3 2 9 lib active record relation query m
  • 如何在启动 Rails 控制台时自动运行代码?

    假设每次 Rails 控制台出现时我都想要一个问候语 Scotts MBP 4 ucode scott rails c Loading development environment Rails 4 2 1 Hello there I m
  • Rails - 使链接与 ajax 一起工作

    我有一个链接 应该使用 ajax 加载它旁边的部分内容 而无需重新加载页面 链接在这里 这是链接应该转到的控制器 class ProfilesController lt ApplicationController def profile f
  • Rails 建模:将 HABTM 转换为 has_many :through

    我正在现有的 Rails 站点上进行维护工作 并且遇到了一些由多对多关联引起的问题 看起来该网站最初是使用has and belongs to many对于一些业务逻辑变得更加复杂的关系 所以我需要使用has many through而是支
  • Mongoid 4 / MongoDB 2.4+“冻结”问题

    自从使用 Mongoid 维护与 mongodb 的连接以来 我遇到了一个奇怪的问题 我认为这最初是由于升级到 Rails 4 0 需要更新 Mongoid Moped 但我在其他基于 Rack 的应用程序 具体来说是 Sinatra 和
  • Rails_admin 中的范围作为过滤器

    我在我的应用程序中使用rails admin 我的模型上有一些范围 以下是一个示例 class User lt ActiveRecord Base scope unconfirmed where confirmed at IS NULL e
  • application.css 未作为资产提供

    编辑4 5和6 8小时后 欢迎任何更多的想法 也许这个错误已经被知道并解决了 但是当你在 app assets stylesheets 的 css erb 文件中有这个时 我得到了我在编辑 2 3 中描述的行为 li background
  • 遏制gem安装:捆绑安装失败,但正常gem安装有效[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions solve
  • 具有多个可选参数的 Rails 3 路线

    我正在尝试创建一个具有可选参数和不同顺序的 Rails 路线 这个问题描述了一个类似的问题 具有多个 可选且漂亮参数的路由 https stackoverflow com questions 14007593 routes with mul
  • Rails 4 - 将地址保存为数据库中的一列

    我是 Rails 新手 正在开发一个简单的应用程序 我的 ERD 中有一个名为 Client 的模型 并且希望保存每个客户的地址 我最初的想法是将地址保存为单独的字段 即 rails g model Client address first
  • Watir 脚本偶尔返回 Net::ReadTimeout 错误

    我有一个 Watir 脚本 偶尔会意外地返回此错误 Net ReadTimeout 我搜索了这个错误并发现这个问题 https stackoverflow com questions 47452276 watir get sometimes
  • 从 Facebook 重定向 URL 中删除“#_=_”[重复]

    这个问题在这里已经有答案了 根据https developers facebook com blog post 552 https developers facebook com blog post 552 FB Graph API 现在附
  • 如何在 Rails 2.3.5 中从模型渲染部分

    我有一个 Rails 2 3 5 应用程序 我试图从模型中渲染几个部分 我知道 我知道 我不应该这样做 我这样做的原因是我将 Comet 服务器 APE 集成到我的 Rails 应用程序中 并且需要根据模型的事件 例如 after crea
  • Rails 3.2 开发模式不显示带有回溯等的完整错误页面

    我刚刚升级到 Rails 3 2 一切正常 除了错误页面不再显示正常的开发调试信息 相反 它显示标准生产错误页面 白色背景 中间有红色文本 很抱歉 出了点问题 我们已收到有关此问题的通知 我们会尽快查看 Rails 3 2 是否有新的设置或
  • 向 Rails 应用程序中的内置类添加方法

    我想向 Rails 应用程序中的 Array 类添加一个方法 我应该把这个方法放在哪里 编辑得更清楚 显然我把它放在某个文件中 但是我如何告诉 Rails 应用程序在哪里可以找到它 执行此操作的一种方法是在以下位置创建一个文件lib rai
  • “rake db:seed”和 rake db:fixtures:load 之间有什么区别

    我是 Ruby 和 Rails 的新手 对某些事情感到好奇 在两个不同的教程中 我看到他们使用不同的方法用基本测试信息填充数据库 一种方法是使用 rake db seed 从包含示例数据的文本文件中提取数据 另一个使用 rake db fi
  • Correct_user 和 admin 的多个 before_filter 语句

    我有一个组资源 我正在尝试使用适当的授权来设置该资源 我试图实现的授权逻辑是这样的 只有群组成员才能查看他们的群组 管理员可以查看any组 以及采取其他行动 我尝试在组控制器中使用以下 before filter 语句来执行此操作 befo
  • 无法验证 CSRF 令牌的真实性 Rails/React

    我的 Rails 应用程序中有一个 React 组件 我正在尝试使用它fetch 发送一个POST对于我在本地主机上托管的 Rails 应用程序 这给了我错误 ActionController InvalidAuthenticityToke
  • 我在 apache 中使用乘客 for Rails 时收到 403 错误

    我已经安装了所需的工具 并遵循了几个教程 试图让乘客做出回应 我可以访问公共文件夹 public 500 html 或 422 hml 中的静态文件 昨天我通过虚拟主机进入 发现一些乘客错误 但一段时间后 托管重新启动了服务 从那时起我就无

随机推荐