Pedro Morte Rolo Pedro Morte Rolo - 4 months ago 17
Ruby Question

Making Rails #destroy_all run faster

I want to run

Alarm.destroy_all
, though, each alarm is associated to many
AlarmEvent
s, and each
AlarmEvent
is associated to many
AlarmEvent::Measurement
s,being both associations marked as
:dependent=>destroy


So, when I invoke Alarm.destroy all, this invokation is taking ages to run. Is there any way I could make it faster? How?

Until now I've tried
Alarm.joins(:alarm_events).destroy_all
and it is still slow.

Answer

The faster alternative to destroy_all is delete_all but this won't chase down and destroy any dependencies, nor will it trigger any before_destroy or after_destroy hooks.

If you're really concerned about speed, you'd probably re-write this with this in mind. You can even rack it up as a series of conditions:

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