2008-10-07 2 views

Répondre

37

Vous pouvez aussi le faire facilement sans hardcoding quoi que ce soit et exécuter automatiquement les migrations:

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) 

je trouve utile de rétablir ensuite l'ancienne connexion sur un modèle particulier:

CustomerModel.establish_connection(RAILS_ENV) 
+0

Pourquoi cela a-t-il besoin d'un chemin sur le système de fichiers? –

14

vous pouvez modifier la connexion à ActiveRecord à tout moment en appelant ActiveRecord :: Base.establish_connection (...)

IE:

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

Notez que cela effacera votre cache - il fera donc un 'Afficher les tables comme% eachtable%' et affichera create table 'pour chaque table. Un problème seulement si vous faites une nouvelle connexion sur chaque requête ... – Kevin

6

Il a été un moment depuis que cette question a été créé, mais je dois dire qu'il ya une autre façon aussi:

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 

Et .env (avec dotenv-rails petit bijou par exemple):

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

Et maintenant, vous pouvez:

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