如何使用依赖:销毁而不造成无限循环

Posted

技术标签:

【中文标题】如何使用依赖:销毁而不造成无限循环【英文标题】:How use dependent: destroy without causing infinite loop 【发布时间】:2020-06-03 12:14:40 【问题描述】:

我有两个模型。带有belongs_to :model_two 的模型一和带有has_one :model_one 的模型二。他们都有dependent: :destroy

当我尝试self.model_one = nil 时,它进入了无限循环。

SystemStackError:
       stack level too deep

如果我将模型一中的关联更改为dependent: :delete,它可以正常工作,但它很可能会通过在 DB 中直接删除来跳过模型中的一些钩子。

如何在不引起循环的情况下使用dependent: :destroy

【问题讨论】:

这个答案有帮助吗? ***.com/a/39091508/4414956 【参考方案1】:

您不必在两个模型上都运行dependent: :destroy。在具有has_many :model_one 的模型上运行就足够了。

例如:

## User Model
class User < ActiveRecord::Base
  has_many :articles, dependent: :destroy
end

## Article model
class Article < ActiveRecord::Base
  belongs_to :user
end

上面的代码说当一个特定的用户被删除时,也会删除该用户创建的所有文章。就是这样。

您的代码所做的是,当删除用户时,删除该用户删除的所有文章,然后再次跳转到删除用户等等..

【讨论】:

在某些情况下,您仍然需要一个双向的 dependent: :destroy 来运行您的回调,无论您在关系的哪一侧调用了destroy。 正如我所写,我没有has_many 边。我有belongs_tohas_one 边。我将尝试用示例更新问题。【参考方案2】:

这在 Rails 4 中是不可能的。你不能在关联的两边都使用dependent: :destroy,因为它会导致无限循环。您需要删除关联一侧的dependent: :destroy 选项。

Bi-directional dependent: :destroy support 已添加到 Rails 5 中,如果您需要此功能,最好的办法是升级您的应用程序,因为它没有向后移植。

【讨论】:

以上是关于如何使用依赖:销毁而不造成无限循环的主要内容,如果未能解决你的问题,请参考以下文章

尽管依赖项没有变化,useEffect 运行无限循环

如何避免“React Hook useEffect 缺少依赖项”和无限循环

当我在 HttpInterceptor 类中注入使用 HttpClient 的服务时,Angular 6 进入循环依赖的无限循环

对'URLSession'使用依赖注入会导致“BAD ACCESS”无限循环错误

如果依赖项中存在无法解决的冲突,则 Pip 安装会陷入无限循环

如何可视化vue无限更新循环的无限循环