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

时间:2011-05-05 00:55:15

标签: ruby-on-rails ruby activerecord yaml

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

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

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

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

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

2 个答案:

答案 0 :(得分:25)

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

您的连接建立代码如下所示:

@environment = ENV['RACK_ENV'] || 'development'
@dbconfig = YAML.load(File.read('config/database.yml'))
ActiveRecord::Base.establish_connection @dbconfig[@environment]

答案 1 :(得分:4)

我建议使用rails runner

Runner脚本可以访问所有内容,包括数据库,但没有MVC模型中的所有视图内容。它们非常适用于后端任务或在数据库上工作但没有任何接口的作业。

您也可以使用rails rake代替,但我觉得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! }

显示它是多么容易。