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