Подтвердить что ты не робот

Как я могу динамически изменять базу данных Active Record для всех моделей в Ruby on Rails?

В нашей программе каждый клиент получает свою собственную базу данных. Мы отправляем им по электронной почте ссылку, которая связывает их с их базой данных. Ссылка содержит GUID, который позволяет программе узнать, к какой базе данных подключиться.

Как я динамически и программно подключаю ActiveRecord к правой db?

4b9b3361

Ответ 1

Вы также можете легко это сделать, ничего не программируя и автоматически запустив миграцию:

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)

Я считаю полезным восстановить старое соединение на определенной модели впоследствии:

CustomerModel.establish_connection(new_spec)

Ответ 2

вы можете в любое время изменить соединение с ActiveRecord, вызвав ActiveRecord:: Base.establish_connection (...)

IE:

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

Ответ 3

Прошло некоторое время, так как этот вопрос был создан, но я должен сказать, что есть и другой способ:

conn_config = ActiveRecord::Base.connection_config
conn_config[:database] = new_database
ActiveRecord::Base.establish_connection conn_config

Ответ 4

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 gem):

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

И теперь вы можете:

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