2009-08-17 66 views
1

我有一個模型使用after_update來記錄更改。有一種情況是我想在不激活此日誌記錄機制的情況下對模型進行更改。有沒有辦法將參數傳遞給after_update,還是一起跳過?跳過after_update回調

我想要一個很好的解決方案,並且如果有更好的方法去除它,我願意刪除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

這就是我所做的,但它感覺ha。。我想現在有沒有辦法使用鐵軌 – Ori 2009-08-19 19:11:20

+0

如果你想出了一個更優雅的解決方案,請讓我知道。謝謝。 – mikej 2009-08-20 07:35:45

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)