2010-03-25 10 views
5

मेरे पास कुछ प्रारंभिक कार्य हैं जिनका उपयोग मैं PostgreSQL में डीबी सर्वर पक्ष (यानी रेल नहीं) पर ऑडिट लॉगिंग सेट अप करने के लिए करता हूं। कम से कम एक में जारी किया जाना है (किसी भी ऑडिट टेबल को डेटा डालने या अपडेट करने से पहले (वर्तमान उपयोगकर्ता को सेट करना), या फिर पूरी क्वेरी शानदार रूप से विफल हो जाएगी।रेल में डीबी कनेक्शन पर मैं क्वेरी कैसे निष्पादित करूं?

मैं कोड में किसी भी सहेजने के संचालन को चलाने से पहले इन्हें आसानी से कॉल कर सकता हूं, लेकिन डीआरवाई मुझे लगता है कि मुझे जितना संभव हो सके कोड को दोहराया जाना चाहिए, खासकर जब यह डाटाबेस अज्ञेयवाद के आदर्श से बहुत अलग हो जाता है। वर्तमान में मैं इसे प्रारंभ करने के लिए प्रारंभकर्ता में ActiveRecord :: Base.establish_connection को ओवरराइड करने का प्रयास कर रहा हूं ताकि जैसे ही मैं स्वचालित रूप से कनेक्ट हो जाऊं, प्रश्नों को चलाया जा सके, लेकिन यह व्यवहार नहीं करता है क्योंकि मैं इसकी अपेक्षा करता हूं। यहाँ प्रारंभकर्ता में कोड है:

 
class ActiveRecord::Base 
    # extend the class methods, not the instance methods 
    class << self 
    alias :old_establish_connection :establish_connection # hide the default 

    def establish_connection(*args) 
     ret = old_establish_connection(*args) # call the default 

     # set up necessary session variables for audit logging 
     # call these after calling default, to make sure conn is established 1st 
     db = self.class.connection 
     db.execute("SELECT SV.set('current_user', '[email protected]')") 
     db.execute("SELECT SV.set('audit_notes', NULL)") # end "empty variable" err 

     ret # return the default's original value 
    end 
    end 
end 

puts "Loaded custom establish_connection into ActiveRecord::Base" 
 
sycobuny:~/rails$ ruby script/server 
=> Booting WEBrick 
=> Rails 2.3.5 application starting on http://0.0.0.0:3000 
Loaded custom establish_connection into ActiveRecord::Base 

यह मैं किसी भी त्रुटि नहीं देता है, और दुर्भाग्य से मैं जांच नहीं कर सकता विधि आंतरिक रूप से कैसा दिखता है (मैं ActiveRecord :: Base.method उपयोग कर रहा था (: establ_connection), लेकिन जाहिर है कि हर बार इसे एक नया विधि ऑब्जेक्ट बनाता है जिसे यह कहा जाता है, जो प्रतीत होता है कि यह किसी भी उपयोगी जानकारी के लिए object_id की जांच नहीं कर सकता है और मैं संकलन को उलट नहीं सकता)।

हालांकि, कोड कभी भी कॉल नहीं होता है, क्योंकि डेटाबेस ऑब्जेक्ट पर सहेजने या अद्यतन चलाने का कोई भी प्रयास विफल रहता है जैसा कि मैंने पहले भविष्यवाणी की थी। यदि डेटाबेस के संबंध में तुरंत कोड निष्पादित करने का यह उचित तरीका नहीं है, तो क्या है?

उत्तर

3

रेल कनेक्शन पूलिंग का उपयोग करता है, आप हो सकता है तो आपका सर्वश्रेष्ठ दांव ActiveRecord :: ConnectionAdapters के लिए एक alias_method_chain :: ConnectionPool # new_connection

module ActiveRecord 
    Module ConnectionAdapters 
    class ConnectionPool 
     alias_method_chain :new_connection, :my_stuff 
     private 
     def new_connection_with_my_stuff 
     c = new_connection_without_my_stuff 
     # Do your stuff with 
     # c.exec(<your sql command>) 
     c 
     end 
    end 
    end 
end 
+0

मेरा मानना ​​है कि विधि घोषित होने के बाद alias_method_chain को चलाने की आवश्यकता है। विधि घोषित होने के बाद – Kevin

+0

alias_method_chain को कॉल करने की आवश्यकता है, अन्यथा यह विधि नहीं मिलेगी। साथ ही, सी से चलाने की विधि निष्पादित करने के बजाए निष्पादित होती है (मुझे विश्वास है कि यह त्रुटि मुझे दी गई थी कि निष्पादन निजी था)। लेकिन अन्यथा, यह मेरे द्वारा उठाए गए मुद्दे को हल करता है। धन्यवाद! – sycobuny

+0

और इस संदर्भ में * वर्तमान उपयोगकर्ता * कैसे प्राप्त करें? – mlt

0

क्या आप जानते हैं कि डेटाबेस कनेक्शन स्थापित होने से पहले आपके प्रारंभकर्ता को बुलाया जा रहा है?

गलत क्या हो सकता है पर आधिकारिक जानकारी के बिना, मैं इस तथ्य का लाभ उठाउंगा कि ActiveRecord का स्रोत मेरी हार्ड ड्राइव पर है।

बेस क्लास में खोदें और यह देखने के लिए थोड़ा सा डिबगिंग करें कि जब आपका प्रारंभकर्ता कहलाता है तो ActiveRecord establ_connection को सापेक्ष कहा जा रहा है। या तो वह अतिरिक्त वर्बोज डीबगिंग चालू करें या बस चालू करें।

0

हुक करने कोड लिखने के मामले में डेटाबेस कॉल और initializations रेल उपयोग करने के लिए है टेम्पलेट के रूप में db-charmer से कोड का उपयोग करना चाहते हैं। यह ActiveRecord के साथ बातचीत करने के कई रोचक तरीकों का प्रदर्शन करता है और उनमें से एक शायद आप जो चाहते हैं वह करेंगे।

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

  • कोई संबंधित समस्या नहीं^_^