Автономный ruby ​​- Как загрузить различные среды из database.yml - PullRequest
10 голосов
/ 05 мая 2011

У меня есть фоновый процесс, который изменяет записи в базе данных.Модели подключаются к базе данных, используя что-то вроде этого:

dbconfig = YAML::load(File.open('database.yml'))
ActiveRecord::Base.establish_connection(dbconfig["development"])
class Clcar < ActiveRecord::Base
 ....
end

Все классы моделей имеют эти строки вверху.

Я согласен, что это плохой способ сделать это.

  1. Есть ли лучший способ получить соединение с модельным классом?Как передать соединение с моделью?
  2. Я хочу иметь возможность запускать свой фоновый процесс в другой среде, скажем, "production".

Как мне этого добиться

Ответы [ 2 ]

25 голосов
/ 05 мая 2011

Я бы установил соединение один раз в начале вашего фонового процесса.После того, как вы установили соединение один раз, все модели в любом случае будут работать правильно.

Ваш код установления соединения будет выглядеть примерно так:

@environment = ENV['RACK_ENV'] || 'development'
@dbconfig = YAML.load(File.read('config/database.yml'))
ActiveRecord::Base.establish_connection @dbconfig[@environment]
4 голосов
/ 05 мая 2011

Я бы рекомендовал использовать rails runner.

Скрипты Runner имеют доступ ко всему, в том числе к базе данных, но без всех представлений из модели MVC. Они отлично подходят для внутренних задач или заданий, которые работают с базой данных, но не имеют никакого интерфейса.

Вы также можете использовать rails rake вместо этого, но я чувствую, что грабли предназначены для обслуживания файлов и каталогов, а также для построения структуры, и сценарии запуска лучше для обычных задач, таких как то, что вы периодически запускаете из cron.

У меня есть один, который я использую для получения журналов с сайта, их анализа, а затем вставки в одну из моих баз данных. Нет причин запускать работу как часть приложения Rails, потому что не было необходимости в интерфейсе. Выполнение в виде runner скрипта отлично подходит.

Встроенная справка гласит:

Usage: runner [options] ('Some.ruby(code)' or a filename)

    -e, --environment=name           Specifies the environment for the runner to operate under (test/development/production).
                                     Default: development

    -h, --help                       Show this help message.

You can also use runner as a shebang line for your scripts like this:
-------------------------------------------------------------
#!/path/to/your/rails/app/script/rails runner

Product.find(:all).each { |p| p.price *= 2 ; p.save! }
-------------------------------------------------------------

Последняя строка:

Product.find(:all).each { |p| p.price *= 2 ; p.save! }

показывает, насколько это просто.

...