Duplicata possible:
Comment puis-je éviter d'exécuter des rappels ActiveRecord?
J'ai un modèle comme celui-ci
class Vote < ActiveRecord::Base
after_save :add_points_to_user
.....
end
Est-il possible de forcer le modèle à ignorer les appels add_points_to_user
une fois enregistré? Peut-être quelque chose comme ActiveRecord#delete
contre ActiveRecord#destroy
?
Pour Rails 2, mais pas Rails 3, vous pouvez les utiliser:
object.send(:create_without_callbacks)
object.send(:update_without_callbacks)
Pour Rails 3, ActiveSupport :: Callbacks vous donne le contrôle nécessaire. Je faisais face au même défi dans un scénario d'intégration de données où des rappels normalement souhaitables devaient Vous pouvez réinitialiser en masse les callbacks ou utiliser skip_callback pour désactiver judicieusement, comme ceci:
Vote.skip_callback(:save, :after, :add_points_to_user)
..après quoi vous pouvez opérer sur les instances de vote avec: add_points_to_user inhibé
Ce qui suit s'applique à Rails 2, Rails 3 et Rails 4:
http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#skipping-callbacks
Il fournit une liste de méthodes qui ignorent les rappels, expliquant pourquoi il est dangereux de les utiliser sans un examen attentif. Reproduit ici sous les dispositions de la licence Creative Commons Attribution-Share Alike 3.0.
12 Ignorer les rappels
Tout comme pour les validations, il est également possible d'ignorer les rappels. Ces méthodes doivent cependant être utilisées avec prudence, car d'importantes règles métier et la logique d'application peuvent être conservées dans les rappels. Les ignorer sans comprendre les implications potentielles peut conduire à des données invalides.
- décrémenter
- decrement_counter
- supprimer
- delete_all
- find_by_sql
- incrément
- increment_counter
- toggle
- toucher
- update_column
- tout mettre à jour
- update_counters
Cela sautera vos validations:
vote.save(:validate => false)
plus d'infos ici
Pour ignorer vos rappels et validations, vous pouvez utiliser, update_column v (3.1) ou update_all
vote = Vote.first
vote.update_column(:subject, 'CallBacks')
Apparemment, cela ne fonctionne qu'avec ActiveRecord 3.1
Ou:
Vote.where('id = ?', YourID).update_all(:subject => 'CallBacks')
En fin de compte, vous avez également l'option enfin, et cela sautera tout:
execute "UPDATE votes SET subject = 'CallBacks' WHERE id = YourID"
OK le dernier ce n'est pas si joli.