Стратегии переопределения database.yml?

В моей среде серверы развертывания имеют большую часть информации о подключении, которая находится в database.yml. То есть, они знают, являются ли они серверами разработки, тестирования или производства, и знают соответствующую информацию о подключении к базе данных.

Я могу инкапсулировать эту информацию, например, в класс сервера, чтобы получить информацию:

Server["environment"] #=> production
Server["db_host"] #=> db5.example.com
Server["db_password"] #=> [a decrypted password]

и так далее . Я хотел бы развернуть приложение Rails и настроить его автоконфигурацию на основе настроек сервера. Как лучше всего это сделать?

Один из способов сделать это - использовать Erb в моем файле database.yml:

<%= Server["environment"] %>: 
  adapter: oracle_enhanced
  host: <%= Server["db_host"] %>
  username: db_user 
  password: <%= Server["password"] %>

Я не очень-то рад делать это таким образом, но это сработает. В этом случае, где бы я поместил server.rb, который определяет класс Server - требовать его здесь в yml? app / initializers загружается после того, как ActiveRecord загружает database.yml.

Другое возможное решение - каким-то образом переопределить инициализатор базы данных railties:

# File railties/lib/initializer.rb, line 903
def database_configuration
  require 'erb'
  YAML::load(ERB.new(IO.read(database_configuration_file)).result)
end

Вышеупомянутое вызывается, только если: active_record определяется в config.frameworks. Я не уверен, как бы я переопределил это достаточно рано в последовательности запуска Rails.

Возможно, третий вариант - удалить : active_record из config.frameworks, а затем создать соединение позже, говорят в инициализаторах приложений? Боюсь, у этого может быть много непреднамеренных побочных эффектов.

Я надеюсь , что есть что-то простое и очевидное, чего я не обнаружил, например, функция ActiveRecord, которая позволяет мне отказаться файла database.yml и программно предоставить альтернативную конфигурацию.

22
задан Mark Thomas 17 November 2010 в 13:37
поделиться