我正在尝试决定如何最好地为我的 rails 应用程序设置(如果有的话)外键约束。我有Response
一个belongs_to
模型Prompt
。我想使用:dependent => :destroy
destroy 调用Response
属于已删除的每个,Prompt
并且我正在尝试确定应该在外键上放置什么删除约束。
简而言之,我想得到关于如何最好地利用依赖对象的销毁方法和外键约束的建议,以确保 cruft 不会累积并反映所存储数据的逻辑结构。几个较早的问题,例如我应该使用 ON DELETE CASCADE、:dependent => :destroy 还是两者都使用?和Rails: delete cascade vsdependent destroy问哪个更好,但他们并没有真正说明这两个选择如何相互作用以及它们以什么顺序被触发或在这一点上似乎含糊不清。
在我看来,考虑因素似乎分为几部分:
- 在从数据库中删除父对象之前是否
:dependent => :destroy
首先在依赖对象上调用destroy,所以即使我使用级联删除,仍然会在这些对象上调用destroy? 在从数据库中删除父对象之前(或在事务中)是否
:dependent => :destroy
从数据库中删除依赖对象?换句话说,如果我将级联设置为无效,那么数据库最终会在子对象被删除之前浪费地无效化对子对象的引用吗?删除是由于包含在事务中的原始销毁和链接
:dependent => :destroy
选项而发出的,还是如果我不设置级联删除,不幸的是定时崩溃会在数据库中留下垃圾?- 如果我使用限制作为外键 on_delete 选项,最后将
:dependent => :destroy
确保从数据库中删除父对象?