Rails6.0.2の変更点まとめ

[Ateam Finergy Inc. Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ateam-finergy)の10日目です。

11月5日にRails6.0.1がリリースされましたが、11月27日には早くも6.0.2rc1がリリースされています。
Rails6.0.1から6.0.2への変更点をまとめました。

- 参照
  - [Rails 6.0.1 released](https://weblog.rubyonrails.org/2019/11/5/Rails-6-0-1-released/)
  - [Rails 6.0.2.rc1 has been released!](https://weblog.rubyonrails.org/2019/11/27/Rails-6-0-2-rc1-has-been-released/)
     - [Release 6.0.2.rc1 · rails/rails](https://github.com/rails/rails/releases/tag/v6.0.2.rc1)

# 1. Active Support
## 1-1. initialize時に訳文(`i18n`)を`eager load`する
Rails6.0.1までは、`i18n`の読み込みによってアプリケーションの初期レスポンスが遅くなっていました。そこでRails6.0.2からは、アプリケーションのinitialize時に`i18n`を`eager load`することで、レスポンス速度の低下を避けるようになりました。

具体的には、以下の変更が追加されています。

```ruby:activesupport/lib/active_support/i18n_railtie.rb
config.eager_load_namespaces << I18n
```
`config.eager_load_namespaces`は元々Railsに存在しているオプションで、ここに名前空間を設定すると`config.eager_load`オプションを`true`にしている場合に読み込まれます。

- 参照
  - [Eager load translations during initialization](https://github.com/rails/rails/pull/37756) 
  - [Rails アプリケーションを設定する 3.1 Rails全般の設定](https://railsguides.jp/configuring.html#rails%E5%85%A8%E8%88%AC%E3%81%AE%E8%A8%AD%E5%AE%9A)

## 1-2. `ActiveSupport::Notifications`でスレッドごとのCPUタイムクロックを使用するように
`ActiveSupport::Notifications::Instrument`クラスで、CPU時間の取得に`Process::CLOCK_THREAD_CPUTIME_ID`を使用するようになりました。
Rails6.0.1までは`Process::CLOCK_PROCESS_CPUTIME_ID`を使用していましたが、これでは一般的によく使われているマルチスレッドのWebサーバにおいて、現在のリクエストだけでなく他のリクエストにも時間を費やしてしまうリスクがあります。そこで、`Process::CLOCK_THREAD_CPUTIME_ID`に変更されました。
またこの変更に伴い、`Process::CLOCK_THREAD_CPUTIME_ID`が定義されているかをチェックするようになっています。

- 参照
  - [`cpu_time` in `ActiveSupport::Notifications::Instrumenter` using incorrect clock?](https://github.com/rails/rails/issues/37441)
  - [Use per-thread CPU time clock](https://github.com/rails/rails/commit/0454d2cca9d7eeacea1b67d4971fcb9bdd60b580)
  - [Check the actual constant used](https://github.com/rails/rails/commit/997770f5955a36f0c800388c4592c961e184aec4)

# 2. Active Job
## 2-1. `Sidekiq`が`Active Job`クラスの`sidekiq_options`にアクセスできるように
`Sidekiq`が`Active Job`クラスにアクセスすることにより、その`Active Job`タイプに設定されている`sidekiq_options`にアクセスすることができるようになりました。
Rails6.0.1までは`Active Job`のクラス名を`to_s`していたため文字列型になってしまい、`sidekiq_options`にはアクセスできませんでした。Rails6.0.2からは`to_s`を無くしたことで、アクセスできるようになりました。

- 参照
  - [Allow Sidekiq access to the underlying Job class](https://github.com/rails/rails/pull/37214)

# 3. Action Pack
## 3-1. Railsエンジンにマウント可能なルーティングヘルパーを、システムテストで使えるように
Rails6.0.1のシステムテストにおいて、Railsエンジンにマウント可能なルーティングヘルパー(ex: `engine_name.root_url`)を呼び出すと、未定義のエラーが発生します。
Rails6.0.2では、このエラーを解消しています。

- 参照
  - [Rails v6.0.1 error when using engine routes in System Tests](https://github.com/rails/rails/issues/37754)
  - [[regresion] Allow using mountable engine route helpers in System Tests (v6.0.1)](https://github.com/rails/rails/pull/37757)

# 4. Railties
## 4-1. `Scaffold`ジェネレーターの衝突チェックを修正
`Scaffold`で新たに生成したクラスと既に存在するクラス名が衝突した場合のチェックの処理が、修正されています。

- 参照
  - [Check class collision for scaffold controller generator is broken](https://github.com/rails/rails/issues/37543)
  - [Fix the collision check for the scaffold generator](https://github.com/rails/rails/pull/37644)

## 4-2. 各環境ごとに`autoload_paths`と`autoload_once_paths`と`eager_load_paths`が設定できるように
各環境の設定ファイル(`config/environments/*.rb`)で、`autoload_paths`と`autoload_once_paths`と`eager_load_paths`の値が設定できるようになりました。

- 参照
  - [let environments configure load-related paths](https://github.com/rails/rails/commit/43863bfc5716d8bd2f5be59920239aee1470465a)
  - [rails/railties/CHANGELOG.md](https://github.com/rails/rails/blob/76bafb0b2ff5d4a7afc373191963eb2a243c75d4/railties/CHANGELOG.md)

# 5. 最後に
今回はマイナーバージョンアップなので、細かなバグ修正やパフォーマンス向上がほとんでしたね。
今後もRails6の品質とパフォーマンスが、より向上していくことを期待しています。