2011-08-03 2 views
4

Je veux courir Alarm.destroy_all, cependant, chaque alarme est associée à de nombreux AlarmEvent s, et chaque AlarmEvent est associée à de nombreux AlarmEvent::Measurement s, étant les deux associations marquées comme :dependent=>destroyRails Faire #destroy_all courir plus vite

Alors, quand je invoquer Alarm.destroy tout, cette invocation prend des âges à courir. Y a-t-il un moyen de le rendre plus rapide? Comment?

Jusqu'à présent, j'ai essayé Alarm.joins(:alarm_events).destroy_all et il est encore lent.

Répondre

12

La alternative plus rapide à destroy_all est delete_all mais cela ne pourchasser et détruire toutes les dépendances, ni ne déclenche aucun before_destroy ou after_destroy crochets.

Si vous êtes vraiment préoccupé par la vitesse, vous devriez probablement réécrire ceci en pensant à cela. Vous pouvez même en rack vers le haut comme une série de conditions:

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

Je l'ai améliorée en remplaçant le invokation avec:

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

Cette Garanties encore que les proceedures associés détruire sont couru, mais pré-exécute une grande partie d'entre eux, évitant ainsi beaucoup de "requêtes imbriquées".

+1

Cette solution est seulement judicieuse dans le cas où vous voulez détruire tous les 'AlarmEvent' existants quand vous appelez' Alarm.destroy_all'. Probablement ce que vous voulez, mais juste un avertissement. – Karl

+0

Yeap. Cette solution est ok pour mon modèle. Cependant, ce n'est pas bien si les mesures et les événements d'alarme sont censés exister sans être connectés à un event ou un alarm_event, respectivement. –

Questions connexes