Ruby on Rails 6.1 リリースノート

Rails 6.1の注目ポイント:

  • データベース単位のコネクション切り替え
  • 水平シャーディング
  • 関連付けのstrict loading
  • Delegated Types
  • 関連付けの非同期削除

本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GitHubのRailsリポジトリにあるコミットリストを参照してください。

1 Rails 6.1へのアップグレード

既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 6.0までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 6.1にアップデートしてください。アップグレードの注意点などについてはRailsアップグレードガイドを参照してください。

2 主要な機能

2.1 データベース単位のコネクション切り替え

Rails 6.1でデータベース単位のコネクション切り替え機能が使えるようになりました(#40370。6.0の場合は、ロールをreadingに切り替えるとすべてのデータベースコネクションもreadingロールに切り替わりました。6.1からは、Railsの設定でlegacy_connection_handlingfalseに指定しておけば、対応する抽象クラスでconnected_toを呼び出すことでデータベースへのコネクションを切り替えられます。

2.2 水平シャーディング

Rails 6.0では、データベースの機能的パーティショニング(スキーマの異なる複数パーティション)が提供されていましたが、Active Recordのモデルがクラス単位およびロール単位で1つのコネクションしか持てなかったため、水平シャーディング(スキーマの同じ複数のパーティション)がサポートされていませんでした。Rails 6.1ではこの点が修正され、水平シャーディングを利用できるようになりました(#38531

2.3 関連付けのstrict loading

関連付けのstrict loadingによって、N+1クエリ問題が発生する前に関連付けをeager loadingしてN+1クエリを防げるようになりました(#37400)。

2.4 Delegated Types

「Delegated Types」は、シングルテーブル継承(STI: Single Table Instance)の代替に使える設計です。(#39341)。Delegated Typesはクラス階層を表現するときに有用で、スーパークラスを「スーパークラス自身が持つテーブルで表される具象クラス」にできるようになります。スーパークラスの各サブクラスは、追加属性用に独自のテーブルを持ちます。

2.5 関連付けの非同期削除

関連付けの非同期削除は、関連付けをバックグラウンドジョブでdestroyする機能を追加します(#40157)。データを削除するときのタイムアウトやパフォーマンス上の問題を回避するのに有用です。

3 Railties

変更点について詳しくはChangelogを参照してください

3.1 削除されたもの

  • 非推奨のrake notesタスクを削除

  • 非推奨のconnectionオプションをrails dbconsoleコマンドから削除

  • 非推奨のSOURCE_ANNOTATION_DIRECTORIES環境変数サポートをrails notesから削除

  • 非推奨のserver引数をrailsのサーバーコマンドから削除

  • 非推奨のHOST環境変数でサーバーIPを指定する機能のサポートを削除

  • 非推奨のrake dev:cacheタスクを削除

  • 非推奨のrake routesタスクを削除

  • 非推奨のrake initializersタスクを削除

3.2 非推奨化

(準備中...)

3.3 主な変更

(準備中...)

4 Action Cable

変更点について詳しくはChangelogを参照してください。

4.1 削除されたもの

(準備中...)

4.2 非推奨化

(準備中...)

4.3 主な変更

(準備中...)

5 Action Pack

変更点について詳しくはChangelogを参照してください。

5.1 削除されたもの

  • 非推奨のActionDispatch::Http::ParameterFilterを削除

  • 非推奨のコントローラレベルのforce_sslを削除

5.2 非推奨化

  • config.action_dispatch.return_only_media_type_on_content_typeを非推奨化

5.3 主な変更

  • ActionDispatch::Response#content_typeが完全なContent-Typeヘッダーを返すよう変更

6 Action View

変更点について詳しくはChangelogを参照してください。

6.1 削除されたもの

  • 非推奨のescape_whitelistActionView::Template::Handlers::ERBから削除

  • 非推奨のfind_all_anywhereActionView::Resolverから削除

  • 非推奨のformatsActionView::Template::HTMLから削除

  • 非推奨のformatsActionView::Template::RawFileから削除

  • 非推奨のformatsActionView::Template::Textから削除

  • 非推奨のfind_fileActionView::PathSetから削除

  • 非推奨のrendered_formatActionView::LookupContextから削除

  • 非推奨のfind_fileActionView::ViewPathsから削除

  • ActionView::Base#initializeActionView::LookupContextでないオブジェクトを第1引数として渡す機能(非推奨)を削除

  • 非推奨のformat引数をActionView::Base#initializeから削除

  • 非推奨のActionView::Template#refreshを削除

  • 非推奨のActionView::Template#original_encodingを削除

  • 非推奨のActionView::Template#variantsを削除

  • 非推奨のActionView::Template#formatsを削除

  • 非推奨のActionView::Template#virtual_path=を削除

  • 非推奨のActionView::Template#updated_atを削除

  • ActionView::Template#initializeで必須だった非推奨のupdated_at引数を削除

  • 非推奨のActionView::Template.finalize_compiled_template_methodsを削除

  • 非推奨のconfig.action_view.finalize_compiled_template_methodsを削除

  • ActionView::ViewPaths#with_fallbackのブロック付き呼び出し(非推奨)のサポートを削除

  • render template:に絶対パスを渡せる機能(非推奨)のサポートを削除

  • render file:に相対パスを渡せる機能(非推奨)のサポートを削除

  • 引数を2つ受け取らないテンプレートハンドラー(非推奨)のサポートを削除

  • ActionView::Template::PathResolverのパターン引数(非推奨)を削除

  • 一部のビューヘルパーでオブジェクトのprivateメソッドを呼び出すサポート(非推奨)を削除

6.2 非推奨化

(準備中...)

6.3 主な変更

  • ActionView::Baseのサブクラスが#compiled_method_containerを実装することが必須化された

  • ActionView::Template#initializelocals引数が必須化された

  • アセットヘルパーのjavascript_include_tagstylesheet_link_tagがアセットのプリロードに関するヒントを提供するLinkヘッダを生成するようになった。これはconfig.action_view.preload_links_headerfalseに設定することで無効にできる

7 Action Mailer

変更点について詳しくはChangelogを参照してください。

7.1 削除されたもの

  • 非推奨のActionMailer::Base.receiveを削除(今後はAction Mailboxを利用)

7.2 非推奨化

(準備中...)

7.3 主な変更

(準備中...)

8 Active Record

変更点について詳しくはChangelogを参照してください。

8.1 削除されたもの

  • ActiveRecord::ConnectionAdapters::DatabaseLimitsから以下の非推奨メソッドを削除

    column_name_length table_name_length columns_per_table indexes_per_table columns_per_multicolumn_index sql_query_length joins_per_query

  • 非推奨のActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?を削除

  • 非推奨のActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?を削除

  • 非推奨のActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?を削除

  • 非推奨のActiveRecord::Base#update_attributesおよびActiveRecord::Base#update_attributes!を削除

  • 非推奨のmigrations_path引数を ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_versionから削除

  • 非推奨のconfig.active_record.sqlite3.represent_boolean_as_integerを削除

  • ActiveRecord::DatabaseConfigurationsから以下の非推奨メソッドを削除

    fetch each first values []=

  • 非推奨のActiveRecord::Result#to_hashメソッドを削除

  • ActiveRecord::Relationメソッドでの安全でない生SQLの利用(非推奨)を削除

8.2 非推奨化

  • ActiveRecord::Base.allow_unsafe_raw_sqlを非推奨化

  • connected_toのキーワード引数databaseを非推奨化

  • legacy_connection_handlingtrueを設定している場合のconnection_handlersを非推奨化

8.3 主な変更

  • MySQL: uniquenessバリデーターでデータベースのデフォルトコレーション(collation)が反映されるようになり、大文字小文字を区別する比較をデフォルトで強制しなくなった

  • relation.createのスコープが、初期化ブロック内やコールバック内でクラスレベルのクエリメソッドにリークしないようになった

    変更前:

    User.where(name: "John").create do |john|
      User.find_by(name: "David") # => nil
    end
    

    変更後:

    User.where(name: "John").create do |john|
      User.find_by(name: "David") # => #<User name: "David", ...>
    end
    
  • 名前付きスコープをチェーンしたときのスコープが、クラスレベルのクエリメソッドにリークしないようになった

    class User < ActiveRecord::Base
      scope :david, -> { User.where(name: "David") }
    end
    

    変更前:

    User.where(name: "John").david
    # SELECT * FROM users WHERE name = 'John' AND name = 'David'
    

    変更後:

    User.where(name: "John").david
    # SELECT * FROM users WHERE name = 'David'
    
  • where.notがNORではなくNANDを述部で生成するようになった

    変更前:

     User.where.not(name: "Jon", role: "admin")
     # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
    

    変更後:

     User.where.not(name: "Jon", role: "admin")
     # SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
    

9 Active Storage

変更点について詳しくはChangelogを参照してください。

9.1 削除されたもの

  • ActiveStorage::Transformers::ImageProcessing:combine_options操作を渡すサポート(非推奨)を削除

  • 非推奨のActiveStorage::Transformers::MiniMagickTransformerを削除

  • 非推奨のconfig.active_storage.queueを削除

  • 非推奨のActiveStorage::Downloadingを削除

9.2 非推奨化

  • Blob.create_after_uploadを非推奨化、今後はBlob.create_and_uploadを利用( #34827

9.3 主な変更

  • Blob.create_and_uploadを追加: blobを新規作成し、指定のioをサービスにアップロードする(#34827

  • ActiveStorage::Blob#service_nameカラムを追加: アップグレード後にマイグレーションを実行する必要がある。マイグレーションを生成するためにはbin/rails app:updateを実行する

10 Active Model

変更点について詳しくはChangelogを参照してください。

10.1 削除されたもの

(準備中...)

10.2 非推奨化

(準備中...)

10.3 主な変更

  • Active Modelのエラーが、モデルで発生したエラーのインタラクティブな操作をアプリケーションで簡単に行えるインターフェイスを持つオブジェクトになった(#32313): この機能に含まれるクエリインターフェイスによってテストの精度が向上し、エラーの詳細にアクセスできるようになる。

11 Active Support

変更点について詳しくはChangelogを参照してください。

11.1 削除されたもの

  • config.i18n.fallbacksが空の場合にI18n.default_localにフォールバックする挙動(非推奨)を削除

  • 非推奨のLoggerSilence定数を削除

  • 非推奨のActiveSupport::LoggerThreadSafeLevel#after_initializeを削除

  • 非推奨のModule#parent_nameModule#parentModule#parentsを削除

  • 非推奨のactive_support/core_ext/module/reachableファイルを削除

  • 非推奨のactive_support/core_ext/numeric/inquiryファイルを削除

  • 非推奨のactive_support/core_ext/array/prepend_and_appendファイルを削除

  • 非推奨のactive_support/core_ext/hash/compactファイルを削除

  • 非推奨のactive_support/core_ext/hash/transform_valuesファイルを削除

  • 非推奨のactive_support/core_ext/range/include_rangeファイルを削除

  • 非推奨のActiveSupport::Multibyte::Chars#consumes?およびActiveSupport::Multibyte::Chars#normalizeを削除

  • 非推奨のActiveSupport::Multibyte::Unicode.pack_graphemesActiveSupport::Multibyte::Unicode.unpack_graphemesActiveSupport::Multibyte::Unicode.normalizeActiveSupport::Multibyte::Unicode.downcaseActiveSupport::Multibyte::Unicode.upcaseActiveSupport::Multibyte::Unicode.swapcaseを削除

  • 非推奨のActiveSupport::Notifications::Instrumenter#end=を削除

11.2 非推奨化

  • ActiveSupport::Multibyte::Unicode.default_normalization_formを非推奨化

11.3 主な変更

(準備中...)

12 Active Job

変更点について詳しくはChangelogを参照してください。

12.1 削除されたもの

(準備中...)

12.2 非推奨化

  • config.active_job.return_false_on_aborted_enqueueを非推奨化

12.3 主な変更

  • キューに入っているジョブがabortされたときにfalseを返すようになった

13 Action Text

変更点について詳しくはChangelogを参照してください。

13.1 削除されたもの

(準備中...)

13.2 非推奨化

(準備中...)

13.3 主な変更

  • リッチテキストコンテンツの存在を確認するメソッド(リッチテキスト属性名の後ろに?を追加する)を追加(#37951

  • システムテストケースヘルパーfill_in_rich_text_areaを追加: Trixエディタを探索して、指定のHTMLコンテンツを入力する(#35885

  • ActionText::FixtureSet.attachmentを追加: データベースfixtureで<action-text-attachment>要素を生成する(#40289

14 Action Mailbox

変更点について詳しくはChangelogを参照してください。

14.1 削除されたもの

(準備中...)

14.2 非推奨化

(準備中...)

14.3 主な変更

(準備中...)

15 Ruby on Railsガイド

変更点について詳しくはChangelogを参照してください。

15.1 主な変更

(準備中...)

16 Credits

Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に深く敬意を表明いたします。

フィードバックについて

Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。

原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨

本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。

Railsガイド運営チーム (@RailsGuidesJP)

支援・協賛

Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。

  1. Star
  2. このエントリーをはてなブックマークに追加