मेरे पास कुछ प्रारंभिक कार्य हैं जिनका उपयोग मैं 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 की जांच नहीं कर सकता है और मैं संकलन को उलट नहीं सकता)।
हालांकि, कोड कभी भी कॉल नहीं होता है, क्योंकि डेटाबेस ऑब्जेक्ट पर सहेजने या अद्यतन चलाने का कोई भी प्रयास विफल रहता है जैसा कि मैंने पहले भविष्यवाणी की थी। यदि डेटाबेस के संबंध में तुरंत कोड निष्पादित करने का यह उचित तरीका नहीं है, तो क्या है?
मेरा मानना है कि विधि घोषित होने के बाद alias_method_chain को चलाने की आवश्यकता है। विधि घोषित होने के बाद – Kevin
alias_method_chain को कॉल करने की आवश्यकता है, अन्यथा यह विधि नहीं मिलेगी। साथ ही, सी से चलाने की विधि निष्पादित करने के बजाए निष्पादित होती है (मुझे विश्वास है कि यह त्रुटि मुझे दी गई थी कि निष्पादन निजी था)। लेकिन अन्यथा, यह मेरे द्वारा उठाए गए मुद्दे को हल करता है। धन्यवाद! – sycobuny
और इस संदर्भ में * वर्तमान उपयोगकर्ता * कैसे प्राप्त करें? – mlt