177722693_8aca6c7e82_z

こんにちは。 新卒エンジニアの髙松です。 先日に引き続き、rails5リリースノートの抄訳の後編です。
原文は(http://edgeguides.rubyonrails.org/5_0_release_notes.html)です。

Action Mailer

  • 削除された項目

    • 非推奨になったいた、emailビューの*_pathヘルパーが削除されました。
    • 非推奨になっていた、deliver、deliver!メソッドが削除されました。
  • 重要な変更点

    • テンプレートルックアップが、デフォルトのロケールと、I18nのフォールバックに従うようになりました。
    • コントローラーとジョブで使われている慣習に従い、ジェネレーターで生成されたメーラーに、_mailerという接尾辞が付くようになりました。
    • assert_enqueued_emailsとassert_no_enqueued_emailsが追加されました。
    • メーラーキューの名前を設定するため、config.action_mailer.deliver_later_queue_nameが追加されました。
    • Action Mailer Viewでのフラグメントキャッシュがサポートされました。それに伴い、テンプレートがキャッシュするかどうか設定するconfig.action_mailer.perform_cachingが追加されました。

Active Record

  • 削除された項目

    • 非推奨になっていた、クエリの値として、ネストされた配列を渡すことができなくなりました。
    • 非推奨になっていた、ActiveRecord::Tasks::DetabaseTasks#load_schemaが削除されました。このメソッドはActiveRecord::Tasks::DetabaseTasks#load_schema_forに置き換えられました。
    • 非推奨になっていたserialized_attributesが削除されました。
    • 非推奨になっていた、has_many :throughへの自動のカウンターキャッシュが削除されました。
    • 非推奨になっていた、sanitize_sql_hash_for_conditionsが削除されました。
    • 非推奨になっていた、Reflection#source_macroが削除されました。
    • 非推奨になっていた、symbolized_base_classと、symbolized_sti_nameが削除されました。
    • 非推奨になっていた、ActiveRecord::Base.disable_implicit_join_references=が削除されました。
    • 非推奨になっていた、ストリングアクセサによるconnection specificationへのアクセスが削除されました。
    • 非推奨になっていた、インスタンス依存関係のプリロードのサポートが削除されました。
    • 非推奨になっていた、PostgreSQLでのexclusiveな下限のrangeのサポートを削除しました。
    • 非推奨になっていた、キャッシュされたArelによるリレーションの修正ができなくなりました。これを行うとImmutableRelationエラーが発生します。
    • ActiveRecord::Serialization::XmlSerializerが削除されました。この機能は、activemodel-serializers-xml gemに抜き出されました。
    • レガシー化していた、mysqlデータベースアダプタのサポートを削除しました。ほとんどのユーザはmysql2を使うことができるはずです。誰かメンテナンスをする人が見つかれば、それは別のgemに変更される予定です。
    • protected_attributes gemのサポートを削除しました。
    • 9.1以下のバージョンのPostgreSQLのサポートを削除しました。
    • activerecord-deprevated_finders gemのサポートを削除しました。
  • 非推奨項目

    • クエリの値として、クラスを渡すことが非推奨になりました。代わりに、Stringを渡すことが推奨されます。
    • Active Recordのコールバックチェインを止めるためにfalseを返すことが非推奨になりました。throw(:abort)が推奨される方法です。
    • ActiveRecord::Base.errors_in_transactional_callbacks=が非推奨になりました。
    • Relation#uniqが非推奨になりました。代わりにRelation#distinctを使うことが推奨されます。
    • 配列の代わりにPointオブジェクトを返すことが推奨されるため、PostgreSQL :point型が非推奨になりました。
    • associationメソッドにtruthyを渡すことで強制的にassociationメソッドにtruthyを渡すことで強制的にアソシエーションをリロードすることが非推奨になりました。をリロードすることが非推奨になりました。
    • 新しいkey名が推奨されるため、restrict_dependent_destroyエラー関連のキーが非推奨になりました。
    • tablesの挙動を揃えました。
    • 新しいデータソースの対応が推奨されるため、SchemaCache#tables、 SchemaCache#table_exists?、SchemaCache#clear_table_cache!が非推奨になりました。
    • SQlite3、MySQLアダプタのconnection.tablesが非推奨になりました。
    • tablesメソッドに引数を渡すことが非推奨になりました。mysql2とsqlite3の#tablesはテーブルとビューを返すのに対し、postgresqlではテーブルしか返しません。これらの挙動を一貫させるために、将来的に#tablesはテーブルのみを返すようになります。
    • table_exists?が非推奨になりました。#table_exists?メソッドは、テーブルとビューの両方をチェックします。この挙動を#tablesと合わせるため、将来的に#table_exists?はテーブルのみをチェックするようになります。
    • find_nthにoffset引数を渡すことが非推奨になりました。代わりにリレーションのoffsetメソッドを使ってください。
    • DetabaseStatementsの{insert|update|delete}_sqlが非推奨になりました。代わりにパブリックメソッドの{insert|update|delete}を使用してください。
    • ActiveRecord::connection#quoteにカラムを渡すことが非推奨になりました。
    • find_in_batchesにendオプションを追加しました。これは、バッチ処理をどこで止めればいいか特定するためにstartパラメータを補完します。
  • 重要な変更点

    • テーブルを作成する際のreferencesにforeign_keyオプションが追加されました。
    • 新しいattributes API
    • enumの定義に:_prefix、:_suffixオプションを追加されました。
    • ActiveRecord::Relationに#cache_keyが追加されました。
    • timestampsのデフォルト値のnullをfalseに変更しました。
    • SecureRandomを用いて、モデルのアトリビュートのためのユニークなトークン生成をカプセル化するため、ActiveRecord::SecureTokenが追加されました。
    • #orメソッドがActiveRecord::Relationに追加されました。これによってWHERE、HAVINGをORによって結合することができるようになりました。
    • #touchに:timesオプションが追加されました。
    • 渡されたブロックの中で、レシーバがセーブされないようにするために、ActiveRecord:Base.suppressが追加されました。
    • 現在、アソシエーションが存在しない場合、belongs_toはデフォルトでバリデーションエラーを発生させます。optional: trueによって、アソシエーションごとにこれを無効化させることができます。同時に、belongs_toのoptionalがあるため、requiredオプションは非推奨になりした。
    • db:structure:dumpの挙動を設定するため、config.active_record.dump_schemasが追加されました。
    • config.active_record.warn_on_records_fetched_greater_thanオプションが追加されました。
    • MySQLでのネイティブのJSONデータ型のサポートが追加されました。
    • PostgreSQLで、同時にインデックスを削除することがサポートされました。
    • #views、#views_existsメソッドがconnectionアダプタに追加されました。
    • あるカラムをActive Recordから見えなくさせるために、ActiveRecord::Base.ignored_columnsが追加されました。
    • connection.data_sourcesとconection/data_source_exists?が追加されました。これらのメソッドはどのリレーションがActive Recordを返すことができるか(通常tablesとviews)特定します。
    • fixturesファイルが、YAMLファイル自体でモデルクラスをセットすることができるようになりました。
    • データベースマイグレーションを生成する際、uuidをプライマリーキーとしてデフォルトに設定することができるようになりました。
    • ActiveRecord::Relation#left_joinsとActiveRecord::Relation#left_outer_joinsが追加されました。
    • after_{create,update,delete}_commitコールバックが追加されました。
    • migrationクラスにバージョンAPIが追加されました。これによって、パラメーターのデフォルトを、既に存在するマイグレーションを壊したり、デプリケーションサイクルを通して、上書きされることを強制する必要がなくなりました。
    • ApplicationRecordは、ActionController::Baseの代わりにApplicationControllerをスーパークラスとするapplication controllerのように、すべてのapplication modelのスーパークラスです。これによって、アプリケーション全般に渡るモデルの振る舞いを設定することができます。
    • ActiveRecord#second_to_last、ActiveRecord#third_to_lastメソッドが追加されました。
    • PostgreSQLとMySQLのメタデータのコメントで、データベースオブジェクト(table、column、index)をアノテートすることができるようになりました。
    • mysql2 0.4.4以上のmysql2アダプタに、プリペアドステートメントのサポートが追加されました。これは、これまでは、非推奨になっているmysqlアダプタにのみサポートされていました。有効化するためには、config/database.ymlでprepared_statements: trueとセットしてください。
    • リレーション内のすべてのオブジェクトのコールバックで検証を行うリレーションオブジェクトで、ActiveRecord::Relation#updateが呼び出せるようになりました。
    • saveメソッドに、:touchオプションが追加されました。これによって、レコードはタイムスタンプを更新すること無しに保存されることができます。
    • PostgresSQLのためのexpression indexesとoperator classesがサポートされました。
    • ネストされたアトリビュートのエラーにインデックスを加えるための、:index_errorsオプションが追加されました。
    • 双方向のdestroy dependencyがサポートされました。
    • トランザクションテストで、after_comitコールバックがサポートされました・
    • テーブルに外部キーが存在するか否か確認するための、foreign_key_exists?メソッドが追加されました。
    • 現在以外の時間でレコードにtouchするために、touchメソッドに:timeオプションが追加されました。

Active Model

  • 削除された項目

    • 非推奨になっていた、ActiveModel::Dirty#reset_#{attribute}と、ActiveModel::Dirty#reset_changesが削除されました。
    • XML serializationが削除されました。この機能はactivemodel-serializers-xml gemに移動されました。
    • ActionController::ModelNamingモジュールが削除されました。
  • 非推奨になった項目

    • Active ModelとActiveModel::Validattionsのコールバックチェインを止めるために、falseを返すことが非推奨となりました。今後は、throw(:abort)が推奨されます。
    • 一貫性のない振る舞いをするActiveModel::Errors#get、ActiveModel::Errors#set、ActiveModel::Errors#[]=メソッドが非推奨となりました。
    • validates_length_ofの:tokenizeオプションが非推奨となりました。今後は通常のrubyの該当機能を使うことが推奨されます。
    • ActiveModel::Errors#add_on_empty、ActiveModel::Errors#add_on_blankが非推奨となりました。代替物は現状特にありません。
  • 重要な変更点

    • どのバリデーターが失敗したか確認するためのActiveModel::Errors#detailsが追加されました。
    • インクルード可能なモジュールとして、どんなオブジェクトでも使えるよう、ActiveRecord::AttributeAssignmentがActiveModel::AttributesAssignmentに移動されました。
    • モデルがセーブされた後の、レコードの変更へのアクセスを向上させるため、ActiveModel::Dirty#[attr_name]_previously_changed?、ActiveModel::Dirty#[attr_name]_previous_changeが追加されました。
    • valid?とinvalid?で、一度に複数のコンテキストを検証できるようになりました。
    • validates_acceptance_ofが、デフォルト値として1でなくtrueを受け取るように変更されました。

Active Job

  • 重要な変更点
    • jobクラスへのデリゲートのActiveJob::Base.deserializeが追加されました。jobがシリアライズされ、実行される際読み込まれた時に、jobに任意のメタデータを設定することができます。
    • お互いに影響を与えずに、jobごとにキューアダプタを設定することができるようになりました。
    • 生成されたjobがデフォルトでapp/jobs/application_job.rbを継承するようになりました。
    • DelayedJob、Sidekiq、qu、que、queue_classicが、ActiveJob::Baseに対し、job idをprovider_job_idとして通知することができるようになりました。
    • concurrent-ruby thread poolにjobをキューする、シンプルなAsyncJobプロセッサーと、関連するAsyncAdapterが実装されました。
    • デフォルトのアダプタをinlineからasyncに変更しました。

Active Support

  • 削除された項目

    • 非推奨になっていた、ActiveSupport::JSON::Encoding::CircularReferenceErrorが削除されました。
    • 非推奨になっていたメソッドのActiveSupport::JSON::Encoding.encode_big_decimal_as_string=と ActiveSupport::JSON::Encoding.encode_big_decimal_as_stringが削除されました。
    • 非推奨になっていた、ActiveSupport::SafeBuffer#prependが削除されました。
    • Kernelから非推奨になっていたメソッドが削除されました。削除されたのは、silence_stderr、silence_stream、capture、quietlyです。
    • 非推奨になっていた、active_support/core_ext/big_decimal/yaml_conversionsファイルが削除されました。
    • 非推奨になっていた、ActiveSupport::Cache::Store.instrument,
      ActiveSupport::Cache::Store.instrument=メソッドが削除されました。
    • 非推奨になっていた、Class#superclass_delegating_accessorが削除されました。代わりにClass#class_attributeの使用が推奨されます。
    • 非推奨になっていたTHreadSafe::Cacheが削除されました。代わりにConcurrent::Mapの使用が推奨されます。
    • Object#itselfが、ruby2.2で実装されたため、削除されました。
  • 非推奨になった項目

    • MissingSourceFileが非推奨になりました。LoadErrorの使用が推奨されます。
    • alias_method_chainが非推奨になりました。ruby2.0で導入されたModule#prependが推奨されます。
    • ActiveSupport::Concurrency::Latchが非推奨になりました。concurrent-rubyのConcurrent::CountDownLatchが推奨されます。
    • number_to_human_sizeの:prefixオプションが非推奨になりました。代替物は現状特にありません。
    • Module#qualified_const_ が非推奨になりました。Module#const_ のメソッドが推奨されます。
    • コールバックの定義にStringを渡すことが非推奨になりました。
    • ActiveSupport::Cache::Store#namespaced_key、 ActiveSupport::Cache::MemCachedStore#escape_key、 ActiveSupport::Cache::FileStore#key_file_pathが非推奨になりました。normalize_keyが推奨されます。
      ActiveSupport::Cache::LocaleCache#set_cache_valueが非推奨になりました。write_cache_valueが推奨されます。
    • assert_nothing_raisedに引数を渡すことが非推奨になりました。
    • Module.local_constantsが非推奨になりました。Module.constants(false)が推奨されます。
  • 重要な変更点

    • #verified、#valid_message?メソッドがActiveSupport::MessageVerifierに追加されました。
    • コールバックチェインを停止させる方法が変更されました。今後推奨される停止方法は明示的なthrow(:abort)です。
    • ActiveRecord、ActiveModel、ActiveModel::Validationsのコールバックチェインが、beforeコールバックでfalseを返すことで止められるかどうかを設定する、config.active_support.halt_callback_chains_on_return_falseオプションが追加されました。
    • デフォルトのテスト順が:sortedから:randomに変更されました。
    • Date、Time、DateTimeに、#on_weekend?、#on_weekday?、#next_weekday、#prev_weekdayメソッドが追加されました。
    • Date、Time、DateTimeの#next_week、#prev_weekに、same_timeオプションが追加されました。
    • #prev_dayと#next_dayに対応する#yesterdayと#tomorrowがDate、Time、DateTimeに追加されました。
    • ランダムなbase58文字列を生成するためのSecureRandom.base58が追加されました。
    • ActiveSupport::TestCaseにfile_fixtureが追加されました。これは、テストケースのサンプルファイルにアクセスするシンプルな仕組みを提供します。
    • 与えられたタイムゾーンから取得したように時間をパースできるようにするActiveSupport::TimeZone#strptimeが追加されました。
    • Integer#zero?のような、Integer#positive?、Integer#negative?クエリメソッドが追加されました。
    • 値が.blank?だった場合にKeyErrorを吐くActiveSupport::OrderedOptionsのbang versionを追加しました。
    • 引数がなければ今年の、あればその年の日数を返すTime.days_in_yearが追加されました。
    • アプリケーションのソースコード、routes、ロケールの変更を非同期で完治するevented file watcherが追加されました。
    • スレッドごとに生存するクラス、モジュール変数を宣言するためのthread_m/cattr_accessor/reader/writerメソッドが追加されました。
    • Array#second_to_last、Array#third_to_lastメソッドが追加されました。
    • Date、Time、DateTimeに#on_weekday?メソッドが追加されました。
    • コンポーネントとライブラリーが、アプリケーションコードの実行と、アプリケーションの再読み込みプロセス参画、また、管理できるように、ActiveSupport::Executor、ActiveSupport::Reloader APIが公開されました。
    • ActiveSupport::DurationがISO8601のフォーマッティング、パーシングをサポートするようになりました。
    • perse_json_timesが有効になっているとき、ActiveSupport::JSON.decodeがISO8601のローカルタイムをサポートするようになりました。
    • ActiveSupport::JSON.decodeがdate stringについて、Dateオブジェクトを返すようになりました。
    • TaggedLoggingが、互いにタグを共有しないように、ロガーが複数回にわたってインスタンス化されることを許可できるようになりました。

抑えておくべきポイント

以上がrails5のリリースノートの抄訳です。
メジャーアップデートなだけあり、重要な変更があり、より洗練された印象です。
各DB関連のクラスで仕様が統一されたことを始め、クエリ関連のメソッドが強化されたりなど、DBの操作周りに嬉しい改善が加えられている点がとても良いですね!
また、全てのapplication modelに対するスーパークラスが定義されたことで、共通の処理を宣言しやすくなったのはなかなか便利な点ではないでしょうか。

引き続き、今後のrailsの動向にも気を配っていきたいです。