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

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

Как динамически и программно подключить ActiveRecord к нужной базе данных?

Ответы [ 4 ]

38 голосов
/ 08 октября 2008

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

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)
15 голосов
/ 08 октября 2008

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

IE:

 ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => new_name, :host => "olddev",
    :username => "root", :password => "password" })
9 голосов
/ 27 мая 2015

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

conn_config = ActiveRecord::Base.connection_config
conn_config[:database] = new_database
ActiveRecord::Base.establish_connection conn_config
2 голосов
/ 24 мая 2017
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 драгоценным камнем):

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

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

Database.development!
User.count
Database.production!
User.count
Database.staging!
User.count
# etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...