В моей среде на серверах развертывания большая часть информации о соединении содержится в файле database.yml.То есть они знают, являются ли они серверами разработки, тестирования или производства, и они знают информацию о своем соответствующем соединении с базой данных.
Я могу, например, инкапсулировать эту информацию в класс Server, чтобы получить информацию:
Server["environment"] #=> production
Server["db_host"] #=> db5.example.com
Server["db_password"] #=> [a decrypted password]
и так далее.Я хотел бы развернуть приложение Rails и настроить его автоматически на основе настроек Сервера.Каков наилучший способ сделать это?
Один из способов сделать это - Erb в моей базе данных .yml:
<%= Server["environment"] %>:
adapter: oracle_enhanced
host: <%= Server["db_host"] %>
username: db_user
password: <%= Server["password"] %>
Я не слишком рад этому, ноэто будет работать.В этом случае, куда бы я поместил «server.rb», который определяет класс Server - требуется это здесь, в yml?Приложение / инициализаторы загружаются после того, как 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 и предоставить альтернативную конфигурацию программно.