RailsのrunnerはRailsの環境の上で任意の処理を書くことができる。 Active Record経由でバッチ処理をするのには最適な機能。
実行の方法は2つある。
  1. Railsで作成したアプリのメソッドを直に指定してやる
  2. ファイルを読み込ませる
紹介されている例は(1)が圧倒的に多く、 lib/配下にTasks::XXXのようなモジュールを作りautoload_pathsを指定してRailsアプリにこのモジュールを読み込ませてやる様な事がされている。 (2)の場合、Webアプリでautoload_pathsやrequireをして処理を記載するファイルを読み込む必要がない。
個人的には、Webアプリと独立したバッチ処理を長々とWebアプリにメソッドとして追加するのは違和感があるので(2)の方が良い気がする。 それに、autoload_pathsを変更しなくていいので簡単。
例:
予めRailsルートはいかにrunner/を作っておく。
mkdir runner
あとは適当なファイルを作って呼び出すだけ。
runner/runner.rb
# Railsでつくったアプリが読み込まれてから実行されるので、何もrequireしなくてもActive Record経由でモデルにアクセスできる
# この場合はTagという名前のモデルが存在する環境
p Tag.count
成功。
$ rails runner runner/runner.rb
21931