在我的项目中,有许多模型带有has_many
关联和dependant: :destroy
标记。此外,每个模型与belong_to
标志具有其他dependant: :destroy
关联。这些模型彼此之间嵌套,因此当在顶部执行destroy
时, Rails 会触发级联在子模型上销毁
除此之外,模型的callbacks
执行before_destroy
。
以下代表我上面所描述的内容:
class Model1Example < ActiveRecord::Base
has_many :model2_examples, :dependent => :destroy
belongs_to :other1_example, :dependent => :destroy
belongs_to :other2_example, :dependent => :destroy
end
class Model2Example < ActiveRecord::Base
belongs_to :model1_example
has_many :model3_examples, :dependent => :destroy
belongs_to :other3_example, :dependent => :destroy
belongs_to :other4_example, :dependent => :destroy
before_destroy :update_something_on_model1
before_destroy :check_some_inconsistence
end
class Model3Example < ActiveRecord::Base
belongs_to :model2_example
belongs_to :other5_example, :dependent => :destroy
belongs_to :other6_example, :dependent => :destroy
before_destroy :update_something_on_model2
before_destroy :check_some_inconsistence
end
鉴于平均Model2Example
在触发Model3Example
Model1Example
时会保留约100个destroy
个实例,会触发许多 SQL查询( 10k +)因为删除是按记录记录的,并且所有规则都是针对每个实例执行的...这比用户等待这样一个简单操作所花费的要多得多。
我可以通过在dependant: :delete_all
关联上使用has_many
来修复此性能问题,因为我并不十分关心触发Model1Example
{时所有这些规则都已执行{1}}。
但问题是当我执行时(来自应用程序的其他地方)destroy
Model2Example
符合我的利益,所有规则都会执行(特别是destroy
每个实例的规则) ,前面提到的方法制动了这个。
是否有&#34; Rails 方式&#34;为这个案例实现性能提升?或者我应该使用 SQL 进行Model3Example
删除?
另外,如果我必须使用这种方法,并且我想在销毁Model1Example
之前检查一些基本内容,哪里是进行此验证的最佳位置?控制器?