独立ruby – 如何从database.yml加载不同的环境
我有一个后台进程来修改数据库中的记录。 模型使用以下内容连接到数据库:
dbconfig = YAML::load(File.open('database.yml')) ActiveRecord::Base.establish_connection(dbconfig["development"]) class Clcar < ActiveRecord::Base .... end
所有模型类都将这些行放在顶部。
我同意这是一个糟糕的做法。
- 有没有更好的方法来连接到模型类? 如何将连接传递给模型?
- 我希望能够在不同的环境中运行我的后台进程,比如“生产”。
我如何实现这一目标?
我会在后台进程开始时设置一次连接。 一旦建立了连接,所有模型都可以正常工作。
您的连接建立代码看起来像这样:
@environment = ENV['RACK_ENV'] || 'development' @dbconfig = YAML.load(File.read('config/database.yml')) ActiveRecord::Base.establish_connection @dbconfig[@environment]
我建议考虑使用rails runner
。
Runner脚本可以访问所有内容,包括数据库,但没有MVC模型中的所有视图内容。 它们非常适用于后端任务或在数据库上工作但没有任何接口的作业。
您也可以使用rails rake
,但我觉得rake任务的目标是维护文件和目录以及构建结构,并且跑步者脚本更适合常规任务,例如您定期从cron运行的内容。
我有一个用于从站点检索日志,解析它们,然后将它们注入我的一个数据库中。 没有理由将该作业作为Rails应用程序的一部分运行,因为不需要接口。 作为runner
脚本运行很好。
内置的帮助说:
用法:runner [options]('Some.ruby(code)'或文件名) -e, - environment = name指定运行器在(测试/开发/生产)下运行的环境。 默认值:开发 -h, - help显示此帮助消息。 你也可以使用runner作为你的脚本的shebang行,如下所示: -------------------------------------------------- ----------- #!/ 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! }
显示它是多么容易。