2010-11-17 12 views
20

मेरे पर्यावरण में, परिनियोजन सर्वर में डेटाबेस कनेक्शन में अधिकांश कनेक्शन जानकारी होती है। यही है, वे जानते हैं कि वे विकास, परीक्षण या उत्पादन सर्वर हैं, और वे अपनी संबंधित डेटाबेस कनेक्शन जानकारी जानते हैं।डेटाबेस.आईएमएल ओवरराइड करने के लिए रणनीतियां?

मैं उदाहरण के लिए एक सर्वर कक्षा में इस जानकारी को संपुटित कर सकते हैं, ताकि मैं जानकारी पुनः प्राप्त कर सकते हैं:

Server["environment"] #=> production 
Server["db_host"] #=> db5.example.com 
Server["db_password"] #=> [a decrypted password] 

और इतने पर। मैं एक रेल एप्लिकेशन को तैनात करना चाहता हूं और इसे सर्वर सेटिंग्स के आधार पर स्वत: कॉन्फ़िगर करना चाहता हूं। इसे करने का बेहतरीन तरीका क्या है?

एक तरीका यह है करने के लिए अपने database.yml में Erb है:

<%= Server["environment"] %>: 
    adapter: oracle_enhanced 
    host: <%= Server["db_host"] %> 
    username: db_user 
    password: <%= Server["password"] %> 

मैं इसे इस तरह से करने के बारे में भी रोमांचित नहीं हूँ, लेकिन यह काम करेगा। इस मामले में, मैं 'server.rb' कहां रखूंगा जो सर्वर क्लास को परिभाषित करता है - इसे येल में यहां चाहिए? ActiveRecord लोड डेटाबेस.yml के बाद ऐप/प्रारंभकर्ता लोड हो जाता है।

# File railties/lib/initializer.rb, line 903 
def database_configuration 
    require 'erb' 
    YAML::load(ERB.new(IO.read(database_configuration_file)).result) 
end 

ऊपर केवल तभी कहा जाता है:: active_record config.frameworks में परिभाषित किया गया है

एक अन्य संभावित समाधान किसी भी तरह railties 'डेटाबेस प्रारंभकर्ता ओवरराइड करने के लिए है। मुझे यकीन नहीं है कि मैं रेल स्टार्टअप अनुक्रम में पर्याप्त जल्दी से ओवरराइड करने के बारे में कैसे जाउंगा।

शायद एक तीसरा विकल्प को हटाएं: config.frameworks से active_record, और बाद में कनेक्शन बनाएं, ऐप प्रारंभकर्ताओं में कहें? मुझे डर है कि इसमें बहुत से अनपेक्षित साइड इफेक्ट्स हो सकते हैं।

मैं की उम्मीद कर रहा हूं कि कुछ सरल और स्पष्ट है कि मुझे कोई ActiveRecord सुविधा नहीं मिली है जो मुझे डेटाबेस.इएमएल से ऑप्ट आउट करने और प्रोग्रामेटिक रूप से वैकल्पिक कॉन्फ़िगरेशन प्रदान करने की अनुमति देती है।

+1

निर्मित एक समाधान के लिए मेरे आशा धराशायी कर रहा है। स्पष्ट रूप से कुछ साल पहले रेल की कोर टीम पर एक पैच पर चर्चा हुई जिसने डेटाबेस.आईएमएल के लिए रूबी विकल्प प्रदान किया था, और इसका कुछ समर्थन था, लेकिन इसे खारिज कर दिया गया था। http://www.mail-archive.com/[email protected]/msg06694.html –

+1

नोट: रेल 3.1.2 के रूप में, 'डेटाबेस_configuration' विधि' रेल :: अनुप्रयोग :: कॉन्फ़िगरेशन 'में स्थित है । पिछले संस्करणों में, यह 'रेल :: कॉन्फ़िगरेशन' में था। –

उत्तर

11

यहां दो चालें हैं जो यहां सहायता कर सकती हैं। एक ऐसा है जिसे आपने स्पर्श किया है, कि डेटाबेस कॉन्फ़िगरेशन में लोड होने वाली दिनचर्या बंदर-पैचिंग होने के नाते, और यह निश्चित रूप से कुछ मूल्यवान है। रूबी के बारे में अच्छी बात यह है कि आप जो कुछ भी पसंद नहीं करते हैं उसे बहुत ज्यादा पैच कर सकते हैं और इसे बेहतर तरीके से बदल सकते हैं। यहां देयता यह है कि रेल का एक नया संस्करण विन्यास के लिए एक अलग तंत्र का उपयोग कर सकता है और आपके पैच सबकुछ तोड़ने का कारण बनेंगे। शायद यह भुगतान करने लायक मूल्य है।

अन्य दृष्टिकोण database.yml फ़ाइल को अपने भंडार के बजाय सर्वर पर रखना है, और किसी प्रकार की परिनियोजन स्क्रिप्ट है जो इसे उचित स्थान से जोड़ती है। इस दृष्टिकोण का लाभ यह है कि आपके पास अपने संस्करण नियंत्रण प्रणाली में चारों ओर महत्वपूर्ण पासवर्ड नहीं हैं और आप एप्लिकेशन को पैच किए बिना सर्वर की कॉन्फ़िगरेशन अपडेट कर सकते हैं।

+0

हमेशा प्रीइनाइज़रइज़र होता है जिसे आप सर्वर क्लास लोड करने के लिए उपयोग कर सकते हैं, और डेटाबेस.मिल से इसका उपयोग कर सकते हैं। –

+0

@ फ्रैंकोइस यह दिलचस्प है। मुझे preinitializer के बारे में पता नहीं था। धन्यवाद! –

+0

कोई भी विचार जहां मैं बंदर-पैच ActiveRecord करने में सक्षम होगा? मुझे एआर लोड के बाद ऐसा करना है लेकिन कनेक्शन से पहले। –

17

आप अपने आवेदन में सीधे अपने डेटाबेस अनुकूलन प्रदान कर सकते हैं। आरबी: यह अच्छा रेल 3.2 काम करता है। (हालांकि चेतावनी दी हो, यह एक तरह-की बंदर पैचिंग है)

module MyApp 
    class Application < Rails::Application 
    # ... config 
    config.encoding = "utf-8" 

    def config.database_configuration 
     parsed = super 
     raise parsed.to_yaml # Replace this line to add custom connections to the hash from database.yml 
    end 
    end 
end 
+0

रूबी 1.9.3 तक काम कर रहा था और फिर मैंने 2.3.x रूबी में अपडेट किया और इसकी फेंकने वाली त्रुटि कह रही है कि सुपर को NoMethodError पर नहीं कहा जा सकता है: सुपर: कोई सुपरक्लास विधि 'डेटाबेस_ कॉन्फ़िगरेशन' नहीं। मैं इस – carbonr

17

इस रेल 3.2.2

module MyApp 
    class Application < Rails::Application 
    self.paths['config/database'] = 'config/another_db.yml' 
    end 
end 
+0

पर एक प्रश्न पूछूंगा धन्यवाद, यह एक और डेटाबेस.आईएमएल को इंगित करने का एक आसान तरीका है। हालांकि, मेरे मामले में, यह मुझे ज्यादा नहीं खरीदता क्योंकि मैं चीजें हार्डकोड नहीं करना चाहता (विशेष रूप से उत्पादन पासवर्ड) तो मुझे अभी भी इसमें एआरबी की आवश्यकता होगी। –

+0

मेरे मामले में, मैंने अलग-अलग वातावरण के लिए अलग .yml सेट किया है। मुझे अभी भी फाइलों में फाइल कॉन्फ़िगरेशन पसंद है, जिनमें से कुछ मेरे स्रोत रेपो में हो सकता है (यानी sqlite3 का उपयोग कर विकास), लेकिन सर्वर पर मैन्युअल रूप से कॉन्फ़िगर किया जा रहा है। – aceofspades

+0

धन्यवाद। Application.rb में 'self.paths [' config/डेटाबेस '] =' config/another_db.yml'' 'जोड़ना Rails3 के लिए काम करता है। –

11

यह एक पुरानी सवाल है में काम करने लगता है, लेकिन रेल 4 में आप बस का उपयोग कर सकते एक पर्यावरण चर और एक खाली या गायब डेटाबेस है।YML (DATABASE_URL किसी भी database.yml को पार कर जाएगी)

DATABASE_URL=postgres://myuser:[email protected]:5432/my-database-name

अधिक यहाँ: http://edgeguides.rubyonrails.org/configuring.html#connection-preference

+0

यह एक devops उपयोग-मामले के लिए मुझे यही चाहिए – gtrak

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