77 votes

Comment ignorer les rappels ActiveRecord?

Dupliquer possible:
Comment puis-je éviter d'exécuter des rappels ActiveRecord?

J'ai modèle comme ça

 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 lorsqu’il est enregistré? Peut-être quelque chose comme ActiveRecord#delete vs ActiveRecord#destroy ?

166voto

tardate Points 6809

Pour Rails 3, ActiveSupport::Rappels vous donne le contrôle nécessaire. J'étais juste en face au même défi dans les données d'un scénario d'intégration où, normalement,-souhaitable-rappels nécessaires pour être écarté. Vous pouvez reset_callbacks en masse, ou de l'utilisation skip_callback pour désactiver de manière judicieuse, comme ceci:

Vote.skip_callback(:save, :after, :add_points_to_user)

..après quoi vous pouvez agir sur le Vote des instances avec :add_points_to_user inhibée

45voto

sheldonh Points 1173

Ce qui suit s'applique à 2 rails, rails de rails 3 et 4:

http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#skipping-callbacks

Il fournit une liste de méthodes que d'ignorer les rappels, en expliquant pourquoi il est dangereux de les utiliser sans un examen attentif. Reproduit ici en vertu des dispositions de la licence Creative Commons Attribution-Share Alike 3.0 License.

12 Sauter Rappels

Tout comme avec les validations, il est également possible d'ignorer les rappels. Ces les méthodes doivent être utilisées avec prudence, cependant, parce que d'importants les règles métier et la logique de l'application peuvent être conservés dans les rappels. Les contourner sans en comprendre les implications potentielles peuvent conduire à des données non valides.

  • décrémenter
  • decrement_counter
  • supprimer
  • delete_all
  • find_by_sql
  • incrément
  • increment_counter
  • bascule
  • touch
  • update_column
  • update_all
  • update_counters

29voto

Stan Bright Points 802

Pour Rails 2, mais pas Rails 3, vous pouvez utiliser ceux-ci:

 object.send(:create_without_callbacks)
object.send(:update_without_callbacks)
 

28voto

workdreamer Points 1360

Cela permettra de sauter vos validations:

vote.save(:validate => false)

plus d'infos ici

Pour sauter vos rappels et de validation, vous pouvez utiliser, update_column v(3.1), ou update_all

vote = Vote.first
vote.update_column(:subject, 'CallBacks')

Aparentlly cela ne fonctionne qu'avec ActiveRecord 3.1

Ou:

Vote.where('id = ?', YourID).update_all(:subject => 'CallBacks')

À la fin vous avez aussi j'ai enfin l'option et ce va sauter tout:

execute "UPDATE votes SET subject = 'CallBacks' WHERE id = YourID"

OK, le dernier il n'est pas si joli.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X