2011-08-03 3 views
4

Alarm.destroy_all을 실행하고 싶습니다. 각 알람은 여러 AlarmEvent과 연관되어 있고 각 AlarmEvent은 많은 AlarmEvent::Measurement와 연관되어 :dependent=>destroy레일스 #destroy_all 실행 속도 향상시키기

로 표시된 두 연관입니다. 따라서 Alarm.destroy all을 호출하면이 호출 실행하는 데 나이를 먹고있다. 내가 더 빨리 할 수있는 방법이 있니? 방법?

지금까지 Alarm.joins(:alarm_events).destroy_all을 시도했지만 여전히 느립니다.

답변

12

destroy_all에 빠른 대안은 delete_all하지만이 쫓아 및 종속성을 파괴 않으며 어떤 before_destroy 또는 after_destroy 후크를 게재 할 수 없습니다.

속도에 대해 정말로 염려하는 사람이라면이 점을 염두에두고 다시 쓰는 것이 좋습니다. 당신은 일련의 조건으로 올릴 수 있습니다

내가 가진 invokation를 교체하여 개선
Alarm.delete_all(:id => alarm_ids) 
AlarmEvent.delete_all(:alarm_id => alarm_ids) 
0

:

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

이 여전히 파괴 관련 proceedures가 실행되는 것을 garantees하지만, 사전에 큰 부분을 실행하므로 많은 "중첩 쿼리"가 발생하지 않습니다.

+1

이 솔루션은 'Alarm.destroy_all'을 호출 할 때마다 기존의 모든 AlarmEvent를 파괴하려는 경우에만 유용합니다. 아마도 당신이 원하는 것일뿐입니다. – Karl

+0

Yeap. 이 솔루션은 제 모델에 적합합니다. 하지만 측정 및 알람 이벤트가 각각 alarm_event 또는 알람에 연결되지 않고 존재해야한다면 좋지 않습니다. –