Стратегии для переопределения database.yml? - PullRequest
22 голосов
/ 17 ноября 2010

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

Ответы [ 4 ]

18 голосов
/ 13 февраля 2012

Вы можете предоставить свои собственные настройки базы данных прямо в вашем application.rb: Похоже на работу хороших рельсов 3.2. (Однако, будьте осторожны, это что-то вроде обезьяньего исправления)

module MyApp 
  class Application < Rails::Application
    # ... config 
    config.encoding = "utf-8" 

    def config.database_configuration
      parsed = super
      raise parsed.to_yaml  # Replace this line to add custom connections to the hash from database.yml
    end
  end
end
18 голосов
/ 03 апреля 2012

Это похоже на работу в Rails 3.2.2

module MyApp 
  class Application < Rails::Application
    self.paths['config/database'] = 'config/another_db.yml'
  end
end
14 голосов
/ 30 сентября 2014

Это старый вопрос, но в Rails 4 вы можете просто использовать переменную среды и иметь пустой или отсутствующий database.yml (DATABASE_URL переопределит любой database.yml)

DATABASE_URL=postgres://myuser:mypass@myposgresbox.com:5432/my-database-name

больше здесь: http://edgeguides.rubyonrails.org/configuring.html#connection-preference

11 голосов
/ 17 ноября 2010

Здесь могут помочь два трюка.Одна из них - это то, что вы затронули, это то, что вы запутываетесь в подпрограмме, которая загружается в конфигурацию базы данных, и это, безусловно, стоит изучить.Приятно, что в Ruby вы можете исправлять все, что вам не нравится, и заменять на что-то лучшее.Обязанность здесь заключается в том, что более новая версия Rails может использовать другой механизм для конфигурации, и ваш патч приведет к поломке.Может быть, это цена, которую стоит заплатить.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...