ActiveRecord:destroy_all 是否对关联记录执行回调?

big*_*ato 2 activerecord

我有四个模型:

class Order < WebDatabase
    has_many :shipments

class Shipment < WebDatabase
    belongs_to :order
    has_many :line_items, :order => "id", :dependent => :destroy

class LineItem < WebDatabase
    belongs_to :shipment
    has_many :line_item_messages, :dependent => :destroy

class LineItemMessage < WebDatabase
    belongs_to :line_item
Run Code Online (Sandbox Code Playgroud)

因此,如果我这样做了@order.shipments.destroy_all,是否会因为每个模型上的 :dependent => :destroy而@order.shipments.line_items被破坏和@order.shipments.line_items.line_item_messages被破坏的破坏链?

dax*_*dax 5

是的。

来自文档(重点是我自己的)

destroy_all(条件 = 零)

民众

通过实例化每条记录并调用其销毁方法来销毁符合条件的记录。执行每个对象的回调(包括 :dependent 关联选项和 before_destroy/after_destroy Observer 方法)。返回被销毁对象的集合;每个都将被冻结,以反映不应进行任何更改(因为它们无法持久化)。

注意:当您一次删除许多记录时,每条记录的实例化、回调执行和删除可能会非常耗时。它为每条记录至少生成一个 SQL DELETE 查询(或可能更多,以强制执行您的回调)。如果您想快速删除许多行,而不考虑它们的关联或回调,请改用 delete_all。