我想运行Alarm.destroy_all
但是,每个警报都与许多AlarmEvent
相关联,并且每个AlarmEvent
都与许多AlarmEvent::Measurement
相关联,作为:dependent=>destroy
所以,当我调用Alarm.destroy all时,这个invokation需要很长时间才能运行。有什么方法可以让它更快吗?怎么样?
到目前为止,我已经尝试了Alarm.joins(:alarm_events).destroy_all
,但仍然很慢。
答案 0 :(得分:13)
destroy_all
的更快替代方法是delete_all
,但这不会追逐并销毁任何依赖关系,也不会触发任何before_destroy
或after_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
}
这仍然保证了与破坏相关的进程已经运行,但它预先执行了很大一部分,从而避免了大量的“嵌套查询”。