5

我需要知道何时使用:dependent => :destroy_all以及何时使用:dependent => :destroy

如果我的模型 has_many 子模型并且我使用了会发生:dependent => :destroy什么?它只会破坏第一个子模型吗?

这行代码错了吗:

has_many books, :dependent => :destroy

会是这样吗:

has_many books, :dependent => :destroy_all

?

4

2 回答 2

6

这会毁掉所有的书。他们全部。

has_many books, :dependent => :destroy

要记住的重要一点是,这:dependent => :destroy将导致#destroy在每一本关联的书中调用该方法。通过调用每本书,将为每本书执行#destroy任何before_destroy或回调。after_destroy

自然,如果您有很多相关书籍,则此过程可能会很昂贵。

无效,也许你在:destroy_all:delete_all. 与:delete_all( 而不是:destroy) 的不同之处在于 Rails 将发出一条 SQL 语句来删除所有相关的书籍记录。不会#destroy对任何 Book 记录调用任何方法,并且不会执行before_destroyafter_destroy回调。

好处是单个 SQL 语句从数据库中删除记录的效率比调用#destroy每条记录的效率高很多倍。

了解这一点非常重要。如果您*_destroy在 Book 模型上有任何回调,您应该知道定义:dependent => :delete_all将具有忽略您在 Book 模型上定义的任何回调的效果。

于 2013-01-08T00:39:10.767 回答
0

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

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

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

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

我希望这会有所帮助。

于 2013-01-08T00:22:11.190 回答