これまでrails上でのバッチ処理はscript/runnerを使って以下のようなコマンドで実行していました。
script/runner "eval(IO.readlines('hoge.rb').join)"
でもこれ長いですよね。もっと短くする方法はないかなーと思ってscript/runner --helpしたら「こんな書き方もできるよ」とのこと。
#!/usr/bin/env /path/to/script/runner Product.find(:all).each { |p| p.price *= 2 ; p.save! }
shebangにscript/runnerまでのパスを指定すると、それ以下のスクリプトをrunner環境で実行してくれるみたいです。これにより、たとえば上記のファイルをscript/product_findとしたら
script/product_find
で実行できるようになります。
環境ごとにshebangを書き換えなきゃいけないのがちょっと面倒だけど、これで少し楽になったかなー