2009-08-17 2 views
1

У меня есть модель, которая использует after_update для регистрации изменений. Существует случай, когда я хотел бы внести изменения в модель без активации этого механизма ведения журнала. Есть ли способ передать параметр after_update или пропустить все это вместе?skipping after_update callback

Я бы хотел, чтобы это было хорошим решением, и я хочу удалить after_update, если есть лучший способ сделать это.

ответ

3

Я бы пошел с подходом добавления булевых к модели, как было предложено, но затем напишет метод, который поможет установить и очистить флаг после вашего обновления. например

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 

Затем, чтобы использовать его:

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

Это то, что я сделал, но он чувствует себя хакерским. Наверное, пока нет возможности использовать рельсы. – Ori

+0

Если вы придумали более элегантное решение, сообщите мне. Благодарю. – mikej

0

Вы можете добавить булеву к своей модели, что-то вроде log_last_update, и проверить это в обратном вызове 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

В Rails 2 вы можете использовать частные методы ActiveRecord

update_without_callbacks 
create_without_callbacks 

Они могут быть вызваны с помощью метода отправки:

# Update attributes on your model 
your_model.some_attribute = some_value 

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