如何提高许多级依赖的破坏性能

时间:2016-04-22 12:12:44

标签: ruby-on-rails activerecord destroy cascading-deletes

在我的项目中,有许多模型带有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之前检查一些基本内容,哪里是进行此验证的最佳位置?控制器?

0 个答案:

没有答案