web-dev-qa-db-fra.com

Comment ignorer les rappels ActiveRecord?

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?

73
Jakub Arnold

Pour Rails 2, mais pas Rails 3, vous pouvez les utiliser:

object.send(:create_without_callbacks)
object.send(:update_without_callbacks)
29
Stan Bright

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é

164
tardate

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
45
sheldonh

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.

29
workdreamer