2010-10-12 23 views
5

मेरे आरओआर एप्लिकेशन में लगभग 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 विन्यास की स्थापना में यह सूची। आरबी फाइल।

config.active_record.observers = :audit_observer 

नोट

रेल 4 में, पर्यवेक्षक सुविधा कोर से निकाल दिया जाता है। https://github.com/rails/rails-observers मणि का प्रयोग करें।

+0

महान है, धन्यवाद! इसलिए मुझे सभी मॉडलों को "निरीक्षण" में जोड़ने की ज़रूरत है, है ना? मुझे उम्मीद है कि गतिशील रूप से मॉडल की सूची लाने और इसे "निरीक्षण" करने के लिए पास करने का तरीका होगा? फिर से धन्यवाद। – Saim

+0

मुझे अभी यह मिला: http://stackoverflow.com/questions/516579/is-there-a-way-to-get-a-collection-of-all-the-models-in-your-rails- ऐप – Saim

+0

मेरा जवाब अपडेट किया गया, एक नज़र डालें। –

3

मैं इस पर बहुत देर हो चुकी हूं, लेकिन अगर कोई अन्य रेल 3 का उपयोग कर रहा है और उसे पाता है, तो यह प्रतिक्रिया मदद कर सकती है।

पर्यवेक्षक लोड होने पर कुछ मॉडल लोड नहीं हो सकते हैं। प्रलेखन का कहना है कि आप देखा_classes को ओवरराइड कर सकते हैं, और इस तरह आप सक्रिय रिकॉर्ड के उप-वर्गों को गतिशील रूप से प्राप्त कर सकते हैं।

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

यह वास्तव में अच्छा है, लेकिन मैं निजी विधि कॉल से बचने के लिए 'ActiveRecord :: Base.descendants' का उपयोग करके प्रोत्साहित करता हूं। – ludwigschubert

0

यह वास्तव में 2.3.8 में मेरे लिए बहुत अच्छी तरह से काम करता है:

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

यह मेरे लिए काम करने के लिए लग रहा था:

ActiveRecord::Base.after_save do 
    ... 
end 

वहाँ एक समस्या मैं नहीं दिखाई दे रहा है?

संबंधित मुद्दे