2011-08-03 39 views
4

我想運行Alarm.destroy_all,雖然,每個報警被關聯到很多AlarmEvent秒,每個AlarmEvent關聯到很多AlarmEvent::Measurement S,既是協會標記爲:dependent=>destroy製作的Rails #destroy_all跑得更快

所以,當我調用Alarm.destroy全部,這個調用需要很長時間才能運行。有什麼辦法可以讓它變得更快嗎?怎麼樣?

直到現在我已經試過Alarm.joins(:alarm_events).destroy_all它仍然很慢。

回答

12

destroy_all更快的替代方案是delete_all但這不會追捕和摧毀任何相關性,也不會觸發任何before_destroyafter_destroy掛鉤。

如果你真的關心速度,你可能會重新寫這個。你甚至可以架起來的一系列條件:

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

我已經用替換invokation改進它:

Alarm.transaction{ 
    AlarmEvent::Measurement.destroy_all 
    AlarmEvent.destroy_all 
    Alarm.destroy_all 
} 

這仍然garantees的破壞相關proceedures都跑了,但它預先執行它們中的很大一部分,從而避免了大量的「嵌套查詢」。

+1

只有當您調用Alarm.destroy_all時,您想銷燬每個現有的'AlarmEvent',這種解決方案纔是明智的。可能你想要什麼,但只是一個警告。 – Karl

+0

Yeap。這個解決方案適用於我的模型。但是,如果測量和報警事件分別存在,而沒有連接到任何alarm_event或報警,則不好。 –