2008-10-07 5 views

Antwort

37

Sie können dies auch einfach tun, ohne etwas zu und laufen Migrationen automatisch:

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) 

ich finde es sinnvoll, die alte Verbindung zu einem bestimmten Modell wieder herzustellen danach:

CustomerModel.establish_connection(RAILS_ENV) 
+0

Warum benötigt dies einen Pfad auf dem Dateisystem? –

14

können Sie die Verbindung zur Activejederzeit ändern, indem Aufruf Active :: Base.establish_connection (...)

IE:

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

Beachten Sie, dass dies Ihren Cache löscht - so wird es eine "Zeige Tabellen wie% eachable%" und "create table" für jede Tabelle anzeigen. Nur ein Problem, wenn Sie bei jeder Anfrage eine neue Verbindung herstellen ... – Kevin

6

Es ist schon eine Weile her, seit dieser Frage erstellt wurde, aber ich muß sagen, dass es zu einem anderen Weg:

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 

Und in .env (mit dotenv-rails gem zum Beispiel):

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

Und jetzt können Sie:

Database.development! 
User.count 
Database.production! 
User.count 
Database.staging! 
User.count 
# etc.