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 commeActiveRecord#delete
vsActiveRecord#destroy
?
Réponses
Trop de publicités?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
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
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.