destroy 与 destroy_all

问题描述 投票:0回答:2

我需要知道何时使用

:dependent => :destroy_all
以及何时使用
:dependent => :destroy

如果我的模型有很多子模型,并且我使用了

:dependent => :destroy
,会发生什么?它只会破坏第一个子模型吗?

这行代码有错吗:

has_many books, :dependent => :destroy

是不是这样:

has_many books, :dependent => :destroy_all

ruby-on-rails-3 activerecord
2个回答
7
投票

这将销毁与模型相关的所有书籍:

has_many books, :dependent => :destroy

要记住的重要一点是,

:dependent => :destroy
将导致在每一本相关书籍中调用
#destroy
方法。通过在每本书上调用
#destroy
,将为每本书执行任何
before_destroy
after_destroy
回调。

当然,如果您有很多相关书籍,这个过程可能会很昂贵。

:destroy_all
无效,也许您正在考虑
:delete_all
。与
:delete_all
(而不仅仅是
:destroy
)的区别在于,Rails 将发出单个 SQL 语句来删除所有依赖的图书记录。任何 Book 记录都不会调用
#destroy
方法,也不会执行
before_destroy
after_destroy
回调。

好处是,使用单个 SQL 语句从数据库中删除记录比对每条记录调用

#destroy
效率高很多倍。

了解这一点非常重要。如果您在 Book 模型上有任何

*_destroy
回调,您应该注意定义
:dependent => :delete_all
将会产生忽略您在 Book 模型上定义的任何回调的效果。


0
投票

我很确定第一行是正确的,第二行是错误的。

这里是文档中特定部分的链接:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many-label-Options

我的理解是

:dependent
将循环遍历关联并调用给定的函数,这意味着
:destroy
是正确的调用函数。 (
:destroy_all
仅对收藏有效。)

我希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.