Rails3 runnerを利用してでバッチプログラムを実行するサンプル

Rails3でバッチプログラムを実行する方法は公式ガイドでは以下のように記載されています
http://guides.rubyonrails.org/command_line.html#rails-runner

$ rails runner "Model.long_running_method"

runnerの使い方に付いてぐぐってみましたがRailsの構成まで含めたいい説明ページが無かったので、まとめてみました。

サンプルについて

今回のサンプルでは、認証にdeviseを利用したアプリケーションで、ユーザの招待を一度に行うバッチプログラムを作成しました。
ユーザ一覧はCSVファイルから読み込みます。

deviseの基本的な機能と招待の仕組みの追加に付いては以下の記事を参考にしてください。

プログラムの置き場所の準備

今回バッチプログラムはlib/tasksというディレクトリに配置したいと思います。
lib以下のファイルを読み込むようにconfig/application.rbに以下を追加します。

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

参考:http://hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/

lib/tasksディレクトリにinvitation_task.rbを作成して、以下のようにクラスを定義しました。

class Tasks::InvitationTask
end

メソッドの実装

以下は、メールアドレスをCSVから読み出し、devise inviteを利用して招待メールを送信するバッチプログラムです。
引数にファイル名をとります。

require "csv"

class Tasks::InvitationPrivateBetaTask
  def self.execute(csv_file_name)
    CSV.foreach(csv_file_name) do |row|
      address = row[0]
      User.invite!(:email => address)
    end
  end
end

プログラムの実行

引数にCSVのファイル名をしています。

$ rails runner Tasks::InvitationPrivateBetaTask.execute\(\"test_invite.csv\"\)