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