質問: rails でバッチ処理を実装している初学者2か月の者です。 webアプリだと明確にコントローラとモデルのファイルの置き場所が決まっていますが、 バッチ処理だとどこにおけばよいでしょうか。 想定だと、 ビジネス部分は、モデルに静的メソッドとして実装 コントローラは、バッチ用のコントローラを作って app/controller に置く? これだとなんか気持ち悪い。バッチ処理は 分離したいようなきがします。 バッチ のキックは、runner または rake task であくまでもログ吐きやベンチマーク程度にしたいので、コントローラはどうするか悩ましいです。 よくやるパターンを教えていただきたいです
回答: バッチ処理はRake Taskとして記述するのが良いと思います。簡単な説明がRails Guideにあります。 Rake Taskですが、Railsでは専用のgeneratorが用意されており、例えば次のコマンドで生成できます。 `rails generate task feeds fetch erase add` (`feeds`は任意のネームスペース、`fetch erase add`は任意のタスク名sに置き換えてください) そうするとテンプレートファイルが`lib/tasks/feeds.rake`に生成されるので、この`task xxx: :enviroment do`と`end`の間にバッチで実行したい処理を書きます。この状態だと、コード内でRailsのモデルも使用可能です(`:enviroment`と書いてあるのがキモです)。 ``` desc "TODO" task fetch: :environment do puts 'test' end ``` 例えば上記のように修正を加えた場合、`rake feeds:fetch`というコマンドを実行することで`test`という文字が出力されます。 ビジネスロジックはおっしゃる通りモデルに実装し、ウェブアプリでコントローラに記述していた部分はこのバッチファイルに記し分離するのが良いかなと思います(この場合、コントローラは作成しません)。 余談ですがRake Taskで作成したバッチを回す時のcrontabは、whenever gemを使うことでRubyコードにて生成&更新できるので、使ってみるのも便利かもしれません。