2010-10-12 46 views
5

我的RoR應用程序中有大約40個型號。我想爲所有模型設置after_save回調。一種方法是將其添加到所有模型。由於此回調具有相同的代碼來運行,是否有一種方法可以全局定義它,以便爲所有模型調用它。ActiveRecord所有型號的全局回調

我想這沒有運氣:

class ActiveRecord::Base 

    after_save :do_something 

    def do_something 
    # .... 
    end 
end 

相同的代碼工作,如果我這樣做在個別機型。

感謝, 伊姆蘭

回答

8

你應該使用觀察員此:

class AuditObserver < ActiveRecord::Observer  

    observe ActiveRecord::Base.send(:subclasses) 

    def after_save(record) 
    AuditTrail.new(record, "UPDATED") 
    end 
end 

爲了激活一個觀察者,在你的config /應用config.active_record.observers配置設置列出。 rb文件。

config.active_record.observers = :audit_observer 

在Rails 4,觀察者特徵是從芯去除。使用https://github.com/rails/rails-observers寶石。

+0

很好,謝謝! 所以我需要添加所有的模型來「觀察」,對吧? 我希望有辦法動態獲取模型列表並將其傳遞給「觀察」? 再次感謝。 – Saim 2010-10-12 11:13:39

+0

我剛剛發現這個: http://stackoverflow.com/questions/516579/is-there-a-way-to-get-a-collection-of-all-the-models-in-your-rails-應用程序 – Saim 2010-10-12 11:21:00

+0

更新我的答案,看看。 – 2010-10-12 11:31:04

3

我在這一個很晚,但萬一其他人正在使用Rails 3,並發現這一點,那麼這個響應可能會有所幫助。

當觀察者加載時,某些模型可能不會被加載。該文檔說您可以重寫observed_classes,這樣您就可以動態獲取活動記錄的子類。

class AuditObserver < ActiveRecord::Observer 
    def self.observed_classes     
    ActiveRecord::Base.send(:subclasses)  
    end 
end 
+0

這真的很酷,但我鼓勵使用'ActiveRecord :: Base.descendants'來避免私人方法調用。 – ludwigschubert 2013-04-04 23:35:24

0

其實,這工作得很好,我在2.3.8:

class AudiObserver < ActiveRecord::Observer 
    observe :'ActiveRecord::Base' 
    # 
    # observe methods... 
    # 
end 
1

這似乎爲我工作:

ActiveRecord::Base.after_save do 
    ... 
end 

有沒有,我沒有看到一個問題嗎?