ダメでしょ!

プログラミングとか怒られた話とか…

Rails5 でバッチ処理を利用する際に知らないとハマるかもしれないポイント!

前提

Rails 5.0.2
Ruby 2.4.0

なににハマったのか?

Rails5 で新規アプリを作成していて、バッチ処理を作成しました。
処理は .\lib\tasks\ 配下に格納し、 .\config\application.rb に以下の設定を行いました。

class Application < Rails::Application
  ・・・
  config.autoload_paths += Dir["#{config.root}/lib"]
  ・・・
end

これで lib ディレクトリ配下は自動的に読み込まれる設定になっていると思っていました。
Rails4 時代はこれでよかったんです。。。
さらに、開発環境では問題なくバッチ処理を呼び出すことができます。
これによって問題の解消がますます困難になりました。。。

Rails5 の本番環境では autoload が無効化された

A Guide for Upgrading Ruby on Rails — Ruby on Rails Guides

上記に記載されていますが、Rails5から本番環境では、autoload が無効になっています。
これは、、、知らないと絶対ハマる。

どのように問題に対応するか

上記のURLには解決策として、.\config\application.rb

class Application < Rails::Application
  ・・・
  config.enable_dependency_loading = true
  ・・・
end

と記載することで、autoload するように変更することがあげられています。
しかし、autoload が無効化されたということは、今後使えなくなることが想定されます。
ですので、今回は eager_load を利用することにしました。 .\config\application.rb

class Application < Rails::Application
  ・・・
  config.paths.add 'lib', eager_load: true
  ・・・
end

と指定し、lib ディレクトリ配下を eager_load されるように指定することで問題を解消しました。
app ディレクトリ配下の読み込みはこの eager_load で行われているようなので、これで問題ないはずです。