2008-10-07 7 views

Odpowiedz

37

Można też to zrobić łatwo i bez niczego hardcoding uruchamiane automatycznie migracje:

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) 

uważam za użyteczne w celu przywrócenia starego połączenia na danym modelu potem:

CustomerModel.establish_connection(RAILS_ENV) 
+0

Dlaczego to wymaga ścieżki w systemie plików? –

14

można zmienić połączenia ActiveRecord w dowolnym momencie poprzez wywołanie ActiveRecord :: Base.establish_connection (...)

IE:

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

Pamiętaj, że spowoduje to wyczyszczenie pamięci podręcznej - tak więc zrobi to "Pokaż tabele, takie jak% everytable%" i pokaż tabelę tworzenia "dla każdej tabeli. Tylko problem, jeśli tworzysz nowe połączenie dla każdego żądania ... – Kevin

6

Minęło trochę czasu odkąd ta kwestia została stworzona, ale muszę powiedzieć, że istnieje inny sposób zbyt:

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 

I .env (z dotenv-rails gem na przykład):

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

I teraz można:

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