2009-09-24 7 views
0

J'ai une table où je vide des données de transaction.Rails: Ajouter des données sans déclencher before_save

J'ai un modèle de transaction. Il y a un before_save dans lequel je traite la transaction via la passerelle credit_card et j'utilise les résultats pour remplir le reste des champs dans le modèle de transaction.

J'ai un Observateur de transactions en train de regarder qui envoie une notification lorsqu'il voit une nouvelle transaction. Il tente ensuite de sauvegarder les résultats de cette tentative DANS LA TRANSACTION en utilisant update_attribute.

Ceci provoque sans surprise une boucle infinie puisque l'observateur déclenche l'opération before_save et que nous y retournons.

Existe-t-il un moyen de mettre à jour un ou deux attributs dans l'enregistrement de transaction sans déclencher le rappel before_save? Est-ce que ma seule solution consiste à déplacer les résultats de la notification vers une autre table?

Répondre

2

Il est une des méthodes ActiveRecord privées que vous pouvez utiliser:

update_without_callbacks 

car il est privé, vous devez utiliser envoyer

transaction.send(:update_without_callbacks) 
+0

Incroyable! Je ne suis pas sûr que ce soit une bonne idée de l'utiliser souvent, mais cela fonctionne certainement ici. Merci! – mikewilliamson

+1

C'est quelque chose qui peut-être utilisé dans un pincement sur la console mais je ne sais pas si c'est une bonne idée de l'avoir dans votre code. – nitecoder

+0

Eh, ne fonctionne plus. Vaut la peine cependant :-) –

1

Rapide et non testé, mais l'approche de base que j'utilise est de permettre une condition sur le rappel. La condition peut être ce que vous voulez évidemment.

class ModelWithCallback < ActiveRecord::Base 

    before_save :update_stuff, :if => :update_needed? 

    private 
    def update_stuff 
     ## Your callback code 
    end 

    def update_needed? 
     !(changed.any?{ |field| field == "name" || field == "address") 
    end 
end 
Questions connexes