制作Rails #destroy_all运行得更快

时间:2011-08-03 17:05:37

标签: ruby-on-rails ruby activerecord arel

我想运行Alarm.destroy_all但是,每个警报都与许多AlarmEvent相关联,并且每个AlarmEvent都与许多AlarmEvent::Measurement相关联,作为:dependent=>destroy

所以,当我调用Alarm.destroy all时,这个invokation需要很长时间才能运行。有什么方法可以让它更快吗?怎么样?

到目前为止,我已经尝试了Alarm.joins(:alarm_events).destroy_all,但仍然很慢。

2 个答案:

答案 0 :(得分:13)

destroy_all的更快替代方法是delete_all,但这不会追逐并销毁任何依赖关系,也不会触发任何before_destroyafter_destroy挂钩。

如果你真的关心速度,你可能会考虑到这一点重新编写。您甚至可以将其视为一系列条件:

Alarm.delete_all(:id => alarm_ids)
AlarmEvent.delete_all(:alarm_id => alarm_ids)

答案 1 :(得分:0)

我通过将invokation替换为:

来改进它
Alarm.transaction{
  AlarmEvent::Measurement.destroy_all
  AlarmEvent.destroy_all
  Alarm.destroy_all
}

这仍然保证了与破坏相关的进程已经运行,但它预先执行了很大一部分,从而避免了大量的“嵌套查询”。