В моей среде серверы развертывания имеют большую часть информации о подключении, которая находится в 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 и программно предоставить альтернативную конфигурацию.