Reputation: 29970
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.
Upvotes: 5
Views: 4996
Reputation: 29970
I have improved it by replacing the invokation with:
Alarm.transaction{
AlarmEvent::Measurement.destroy_all
AlarmEvent.destroy_all
Alarm.destroy_all
}
This still garantees that the destroy-associated proceedures are ran, but it pre-executes a big part of them, thus avoiding a lot of "nested queries".
Upvotes: 0
Reputation: 211680
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)
Upvotes: 17