独立ruby – 如何从database.yml加载不同的环境

我有一个后台进程来修改数据库中的记录。 模型使用以下内容连接到数据库:

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

所有模型类都将这些行放在顶部。

我同意这是一个糟糕的做法。

  1. 有没有更好的方法来连接到模型类? 如何将连接传递给模型?
  2. 我希望能够在不同的环境中运行我的后台进程,比如“生产”。

我如何实现这一目标?

我会在后台进程开始时设置一次连接。 一旦建立了连接,所有模型都可以正常工作。

您的连接建立代码看起来像这样:

 @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! } 

显示它是多么容易。