如何使用依赖:销毁而不造成无限循环
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_to
和has_one
边。我将尝试用示例更新问题。【参考方案2】:
这在 Rails 4 中是不可能的。你不能在关联的两边都使用dependent: :destroy
,因为它会导致无限循环。您需要删除关联一侧的dependent: :destroy
选项。
Bi-directional dependent: :destroy
support 已添加到 Rails 5 中,如果您需要此功能,最好的办法是升级您的应用程序,因为它没有向后移植。
【讨论】:
以上是关于如何使用依赖:销毁而不造成无限循环的主要内容,如果未能解决你的问题,请参考以下文章
如何避免“React Hook useEffect 缺少依赖项”和无限循环
当我在 HttpInterceptor 类中注入使用 HttpClient 的服务时,Angular 6 进入循环依赖的无限循环
对'URLSession'使用依赖注入会导致“BAD ACCESS”无限循环错误