我有一个修改数据库中记录的后台进程。模型使用以下内容连接到数据库:
dbconfig = YAML::load(File.open('database.yml'))
ActiveRecord::Base.establish_connection(dbconfig["development"])
class Clcar < ActiveRecord::Base
....
end
所有模型类都将这些行放在顶部。
我同意这是一种糟糕的做法。
我如何实现这一目标?
答案 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! }
显示它是多么容易。