2009-08-17 11 views
1

Ich habe ein Modell, das after_update verwendet, um Änderungen zu protokollieren. Es gibt einen Fall, in dem ich eine Änderung am Modell vornehmen möchte, ohne diesen Protokollierungsmechanismus zu aktivieren. Gibt es eine Möglichkeit, einen Parameter an after_update zu übergeben oder alles zusammen zu überspringen?überspringen after_update Rückruf

Ich möchte eine nette Lösung für diese, und bin bereit, After_update zu entfernen, wenn es einen besseren Weg gibt, um darüber zu gehen.

Antwort

3

Ich würde mit dem Ansatz des Hinzufügens eines booleschen zum Modell wie vorgeschlagen gehen, aber würde dann eine Methode schreiben, um zu helfen, setzen und löschen Sie das Flag nach dem Update. z.B.

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 

Dann, es zu benutzen:

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

das habe ich gemacht, aber es fühlt sich hackisch an. Ich denke, jetzt gibt es keinen Weg mehr mit Schienen. – Ori

+0

Wenn Sie eine elegantere Lösung finden, lassen Sie es mich wissen. Vielen Dank. – mikej

0

Sie könnten Ihrem Modell einen Booleschen Wert hinzufügen, z. B. log_last_update, und dies im after_update-Callback überprüfen.

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

In Rails 2 können Sie private Active Methoden verwenden

update_without_callbacks 
create_without_callbacks 

Sie können über die Sendemethode aufgerufen werden:

# Update attributes on your model 
your_model.some_attribute = some_value 

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