2008-10-07 13 views
27

हमारे कार्यक्रम में, प्रत्येक ग्राहक को अपना डेटाबेस प्राप्त होता है। हम उन्हें एक लिंक ई-मेल करते हैं जो उन्हें अपने डेटाबेस से जोड़ता है। लिंक में एक GUID है जो प्रोग्राम को यह बताता है कि कौन से डेटाबेस से कनेक्ट होना है।रूबी पर रूबी के सभी मॉडलों के लिए मैं सक्रिय रिकॉर्ड डेटाबेस को गतिशील रूप से कैसे बदल सकता हूं?

मैं डायनामिक रूप से और प्रोग्रामिक रूप से ActiveRecord को सही डीबी से कैसे कनेक्ट करूं?

उत्तर

37

तुम भी यह आसानी से कुछ भी हार्डकोड बिना कर सकते हैं और स्वचालित रूप से चलाने माइग्रेशन:

customer = CustomerModel.find(id) 
spec = CustomerModel.configurations[RAILS_ENV] 
new_spec = spec.clone 
new_spec["database"] = customer.database_name 
ActiveRecord::Base.establish_connection(new_spec) 
ActiveRecord::Migrator.migrate("db/migrate_data/", nil) 

मैं इसे उपयोगी बाद में एक विशेष मॉडल पर पुराने संपर्क पुनः स्थापित करने के लिए:

012,
CustomerModel.establish_connection(RAILS_ENV) 
+0

फाइल सिस्टम पर इसे पथ की आवश्यकता क्यों है? –

14

आपको बुला रहा ActiveRecord :: Base.establish_connection (...)

आईई द्वारा किसी भी समय ActiveRecord के लिए कनेक्शन बदल सकते हैं:

ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => new_name, :host => "olddev", 
    :username => "root", :password => "password" }) 
+1

ध्यान दें कि यह आपके कैश को साफ़ कर देगा - इसलिए यह प्रत्येक तालिका के लिए 'प्रत्येक प्रत्येक%% की तरह सारणी दिखाएं' और तालिका बनाएं 'दिखाएगा। केवल एक समस्या यदि आप प्रत्येक अनुरोध पर नया कनेक्शन बना रहे हैं ... – Kevin

6

थोड़ा समय के बाद से यह सवाल बना दिया गया है हो गया है, लेकिन मैं कहना है भी एक और तरीका है कि वहाँ है:

conn_config = ActiveRecord::Base.connection_config 
conn_config[:database] = new_database 
ActiveRecord::Base.establish_connection conn_config 
1
class Database 
    def self.development! 
    ActiveRecord::Base.establish_connection(:development) 
    end 

    def self.production! 
    ActiveRecord::Base.establish_connection(ENV['PRODUCTION_DATABASE']) 
    end 

    def self.staging! 
    ActiveRecord::Base.establish_connection(ENV['STAGING_DATABASE']) 
    end 
end 

और .env (उदाहरण के लिए dotenv-rails साथ मणि) में:

PRODUCTION_DATABASE=postgres://... 
STAGING_DATABASE=postgres://... 

और अब आप कर सकते हैं:

Database.development! 
User.count 
Database.production! 
User.count 
Database.staging! 
User.count 
# etc. 
संबंधित मुद्दे