Railsでバッチ処理を作成してみる(Rakeのタスクの場合)
RailsでSQLを確認してみる
の続き
Railsで、Rakeのタスクの機能を使って、バッチ処理を作成してみる。
作成
タスクを作成すると、
$ rails generate task sample
下記のファイルが作成される。
$ cat lib/tasks/sample.rake
namespace :sample do end
「hello world」を出力するタスクを追加する。
$ vi lib/tasks/sample.rake
namespace :sample do desc "hello world task" task :hello do puts "hello world" end end
下記のコマンドでタスクが確認できる。
$ bundle exec rake -vT ・・・ rake sample:hello # hello world task ・・・
実行すると、「hello world」が出力される。
$ bundle exec rake sample:hello
hello world
モデルの読み込み
Userモデルの検索結果を出力するよう修正する。
$ vi lib/tasks/sample.rake
namespace :sample do desc "hello world task" task :hello => :environment do puts User.first().to_yaml end end
実行すると、検索結果が出力される。
$ bundle exec rake sample:hello --- !ruby/object:User attributes: id: 1 name: 佐藤 point: 100 flag: true day: 2001-01-01 created_at: 2014-01-12 07:09:56.000000000 Z updated_at: 2014-01-12 07:09:56.000000000 Z
「=> :environment」が付いていないと、下記のようなエラーがでる。 $ bundle exec rake sample:hello rake aborted! uninitialized constant User /home/hoge/sample/lib/tasks/sample.rake:4:in `block (2 levels) in' Tasks: TOP => sample:hello (See full trace by running task with --trace)
ログの出力
ログを出力するには、Loggerをnewする必要がある。
$ vi lib/tasks/sample.rake
namespace :sample do desc "hello world task" task :hello => :environment do logger = Logger.new('log/development.log') logger.debug(User.first().to_yaml) end end
実行すると、ログが出力される。
$ bundle exec rake sample:hello
$ cat log/development.log D, [2014-08-03T16:08:55.409326 #2027] DEBUG -- : --- !ruby/object:User attributes: id: 1 name: 佐藤 point: 100 flag: true day: 2001-01-01 created_at: 2014-01-12 07:09:56.000000000 Z updated_at: 2014-01-12 07:09:56.000000000 Z
モジュールの読み込み
モジュールを作成する。
$ vi app/controllers/concerns/module_test.rb
module ModuleTest def hoge puts "hello world from module" end end
モジュールを呼び出すよう修正する。
※モジュールは自動で読み込まれず、
下記のような感じでrequireやincludeするとうまくいった。よく分からん。
$ vi lib/tasks/sample.rake
namespace :sample do require ENV['PWD'] + "/app/controllers/concerns/module_test" include ModuleTest desc "hello world task" task :hello => :environment do hoge end end
実行すると、モジュールのメソッドが実行される。
$ bundle exec rake sample:hello
hello world from module