2009-08-17 8 views
1

J'ai un modèle qui utilise after_update pour enregistrer les modifications. Il y a un cas où je voudrais apporter une modification au modèle sans activer ce mécanisme d'enregistrement. Y a-t-il un moyen de passer un paramètre à after_update, ou de passer tout cela ensemble?ignorer after_update callback

Je voudrais une bonne solution à cela, et je suis prêt à supprimer after_update s'il y a une meilleure façon de procéder.

Répondre

3

Je voudrais aller avec l'approche d'ajouter un booléen au modèle comme suggéré mais écrirais alors une méthode pour aider à placer et effacer l'indicateur après votre mise à jour. par exemple.

def without_logging_changes_to(model) 
    # store current value of the flag so it can be restored 
    # when we leave the block 
    remembered_value = model.log_update 
    model.log_update = false 
    begin 
    yield 
    ensure 
    model.log_update = remembered_value 
    end 
end 

ensuite l'utiliser:

without_logging_changes_to my_model do 
    my_model.update_attributes(updates) 
end 
+0

c'est ce que j'ai fait, mais il se sent hackish. Je suppose que pour l'instant il n'y a aucun moyen de contourner cela en utilisant des rails – Ori

+0

Si vous trouvez une solution plus élégante s'il vous plaît faites le moi savoir. Merci. – mikej

0

Vous pouvez ajouter un booléen à votre modèle qui est quelque chose comme log_last_update et vérifiez cela dans le rappel after_update.

0
class MyModel < ActiveRecord::Base 

    after_update :do_something 

    attr_accessor :should_do_something 



    def should_do_something? 
    should_do_something != false 
    end 

    def do_something 
    if should_do_something? 
     ... 
    end 
    end 

end 


y = MyModel.new 
y.save! # callback is triggered 

n = MyModel.new 
n.should_do_something = false 
n.save! # callback isn't triggered 
0

Dans Rails 2, vous pouvez utiliser des méthodes ActiveRecord privées

update_without_callbacks 
create_without_callbacks 

Ils peuvent être invoquées par la méthode d'envoi:

# Update attributes on your model 
your_model.some_attribute = some_value 

# Update model without callbacks 
your_model.send(:update_without_callbacks)