Come posso modificare dinamicamente il database Active Record per tutti i modelli in Ruby on Rails?

StackOverflow https://stackoverflow.com/questions/180349

Domanda

Nel nostro programma, ogni cliente ottiene il proprio database. Li inviamo per e-mail un collegamento che li collega al loro database. Il collegamento contiene un GUID che consente al programma di sapere a quale database connettersi.

Come posso collegare ActiveRecord dinamicamente e programmaticamente al giusto db?

È stato utile?

Soluzione

Puoi anche farlo facilmente senza codificare nulla ed eseguire automaticamente le migrazioni:

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)

Trovo utile ristabilire la vecchia connessione su un particolare modello in seguito:

CustomerModel.establish_connection(new_spec)

Altri suggerimenti

puoi modificare la connessione in ActiveRecord in qualsiasi momento chiamando ActiveRecord :: Base.establish_connection (...)

IE:

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

È passato un po 'di tempo da quando questa domanda è stata creata, ma devo dire che esiste anche un altro modo:

conn_config = ActiveRecord::Base.connection_config
conn_config[:database] = new_database
ActiveRecord::Base.establish_connection conn_config
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

E in .env (ad esempio con dotenv-rails ):

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

E ora puoi:

Database.development!
User.count
Database.production!
User.count
Database.staging!
User.count
# etc.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top