Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7.2.0 Active Record CHANGELOG(全項目リンク付き)

概要

MITライセンスに基づいて翻訳・公開いたします。

Rails 7.2.0リリース後に必要であれば更新します。

なお、機能削除のエントリについては、原則として7.2での削除プルリクではなく、その機能が非推奨化されたときの過去のプルリクへリンクしています。

Rails 7.2.0 Active Record CHANGELOG(全項目リンク付き)

更新106件(うち非推奨削除29件)

🔗 Fix a performance regression in attribute methods by casperisfine · Pull Request #52118 · rails/rails

  • Active Recordの属性メソッド定義でメモリが肥大化する問題が再発したのを修正

Jean Boussier

🔗 Define the new start_transaction.active_record event · rails/rails@6a05a39

  • Active SupportのInstrumentationで、新しいstart_transaction.active_record通知イベントを定義

このイベントは、データベースのトランザクションまたはsaveポイントが開始されると発火する。これは、それらが終了したときに発火するtransaction.active_recordと対を成す。

このペイロードにはトランザクション(:transaction)とコネクション(:connection)が含まれる。

Xavier Noria

🔗 [Fix #51129] Fix issue with IDs reader on preloaded associations for composite primary keys by Jay0921 · Pull Request #51167 · rails/rails

  • 複合主キーを用いるモデル内でプリロードされた関連付けに対して、IDリーダーメソッドが期待通りの結果を返さない問題を修正

Jay Ang

🔗 Include the current transaction in sql.active_record event payloads · rails/rails@ee3d663

  • sql.active_recordのActive Support通知のペイロードが、:transactionキー内の現在のトランザクションを含むようになった

Xavier Noria

🔗 Pass the transaction object to transaction.active_record subscribers by fxn · Pull Request #51955 · rails/rails

  • transaction.active_recordののActive Support通知のペイロードが、:transactionキーに関連するイベントのトランザクションを含むようになった

Xavier Noria

🔗 Lazily generate UUIDs for AR transactions by fxn · Pull Request #51949 · rails/rails

  • データベーストランザクションのUUIDを返すActiveRecord::Transaction#uuidを定義した

これは、データベースの活動をトレースするときに役立つ可能性がある。これらのUUIDはオンデマンドでのみ生成される。

Xavier Noria

🔗 [Fix #51720] Infer association klass as top level if model has same demodularized name by joshuay03 · Pull Request #51721 · rails/rails

  • 名前空間ありのモデルに関連付けられる、名前空間のない同じ名前のモデル名を正しく推論できるよう修正

以下のセットアップ例で考える。

class Nested::Post < ApplicationRecord
  has_one :post, through: :other
end

修正前は、この#postNested::Postと推論されてしまっていたが、修正後は正しくPostと推論されるようになった。

Joshua Young

🔗 Fix PostgreSQL Cidr#change? to compare with address prefix by taketo1113 · Pull Request #51633 · rails/rails

  • PostgreSQLのCidr#change?でIPアドレスのプレフィックスの変更を検出するよう修正。

Taketo Takashima

🔗 Change BatchEnumerator#destroy_all to return the total number of affected rows by fatkodima · Pull Request #51788 · rails/rails

  • BatchEnumerator#destroy_allが、影響を受ける行の総数を返すよう変更。

修正前は常にnilを返していた。

fatkodima

🔗 Support touch_all in batches by fatkodima · Pull Request #51785 · rails/rails

in_batchestouch_allをサポート。

Post.in_batches.touch_all

fatkodima

参考: Rails API in_batches -- ActiveRecord::Batches
参考: Rails API touch_all -- ActiveRecord::Relation

🔗 Add support for :if_not_exists and :force options to create_schema by fatkodima · Pull Request #51790 · rails/rails

  • (PostgreSQL)create_schema:if_not_existsオプションと:forceオプションをサポート。

fatkodima

🔗 Fix index_errors and provide :nested_attributes_order mode by lulalala · Pull Request #48727 · rails/rails

  • index_errorsが関連付けのバリデーションエラーでインデックスが無効になっていたのを修正。

lulalala

  • index_errors: :nested_attributes_orderモードを追加。

この変更によって、ネステッド属性セッターで受け取った順序に基づく関連付けバリデーションエラーのインデックスが作成され、reject_if設定を尊重するようになる。これにより、バリデーションエラーをフォームの個別のフィールドにマッピングするのに十分な情報をAPIからフロントエンドに提供可能になる。

lulalala

🔗 Add active_record.postgresql_adapter_decode_dates config by JoeDupuis · Pull Request #51763 · rails/rails

  • Rails.application.config.active_record.postgresql_adapter_decode_datesコンフィグを追加。これはPostgreSQLアダプタでdatesの自動デコードをオプトアウトする(デフォルトはtrue)。

Joé Dupuis

🔗 Warn about changing query_constraints: behavior by nvasilevski · Pull Request #51571 · rails/rails

  • 関連付けのquery_constraintsオプションが非推奨化。今後はforeign_keyを使うこと。

Nikita Vasilevsky

🔗 Add ENV["SKIP_TEST_DATABASE_TRUNCATE"] flag to speed up multi-process test runs by dhh · Pull Request #51686 · rails/rails

参考: 週刊Railsウォッチ20240514: Active Recordで再帰的CTEをサポート

  • ENV["SKIP_TEST_DATABASE_TRUNCATE"]フラグを追加。すべてのテストがデフォルトのトランザクション内で実行される場合に、大規模DBでのマルチプロセステストの実行を高速化する。

これにより、HEYのテストが178個のテーブルに対して24個のプロセスで実行され、最大4,000個のテーブルでtruncate_tablesがスキップ可能になり、テスト実行が約10秒短縮される。

DHH

🔗 Add support for recursive CTEs in ActiveRecord by ClearlyClaire · Pull Request #51601 · rails/rails

  • Active Recordで再帰的CTE(common table expressions)のサポートを追加。
Post.with_recursive(
  post_and_replies: [
    Post.where(id: 42),
    Post.joins('JOIN post_and_replies ON posts.in_reply_to_id = post_and_replies.id'),
  ]
)

上によって以下のSQLが生成される。

WITH RECURSIVE "post_and_replies" AS (
  (SELECT "posts".* FROM "posts" WHERE "posts"."id" = 42)
  UNION ALL
  (SELECT "posts".* FROM "posts" JOIN post_and_replies ON posts.in_reply_to_id = post_and_replies.id)
)
SELECT "posts".* FROM "posts"

ClearlyClaire

🔗 Pass validate(_check)_constraint through change_table by ccutrer · Pull Request #51707 · rails/rails

  • マイグレーションのchange_tablevalidate_constraintを呼び出し可能になった。

例:

change_table :products do |t|
  t.check_constraint "price > discounted_price", name: "price_check", validate: false
  t.validate_check_constraint "price_check"
end

Cody Cutrer

🔗 Add a Date decoder to the pg adapter by JoeDupuis · Pull Request #51483 · rails/rails

参考: 週刊Railsウォッチ20240514: PostgreSQLアダプタにDateへのデコード機能が追加

  • PostgreSQLAdapterがdate型のカラムを文字列ではなくDateにデコードするようになった。

例:

ActiveRecord::Base.connection
     .select_value("select '2024-01-01'::date").class #=> Date

Joé Dupuis

🔗 Fix child association loading in :n_plus_one_only mode by reid-rigo · Pull Request #48785 · rails/rails

  • strict_loading!mode: :n_plus_one_onlyオプションを指定することで、子の関連付けをeager loadingしないようになった。

この変更によって子の関連付けがeager loadingされなくなって振る舞いが期待通りになり、firstlastなどのメソッド呼び出しで順序が一定にならない問題を防止する。firstlastそれ自体はN+1問題を引き起こさないので、子の関連付けを呼び出してもraiseしなくなる。
修正: #49473

改修前:

person = Person.find(1)
person.strict_loading!(mode: :n_plus_one_only)
person.posts.first
# SELECT * FROM posts WHERE person_id = 1; -- non-deterministic order
person.posts.first.firm # ActiveRecord::StrictLoadingViolationErrorをraiseする

改修後:

person = Person.find(1)
person.strict_loading!(mode: :n_plus_one_only)
person.posts.first # これは1+1(N+1ではない)
# SELECT * FROM posts WHERE person_id = 1 ORDER BY id LIMIT 1;
person.posts.first.firm # raiseしなくなる

Reid Lynch

参考: Rails API strict_loading! -- ActiveRecord::Core

🔗 dep: allow sqlite3 gem to float to version 2 by flavorjones · Pull Request #51592 · rails/rails

  • Sqlite3Adaptersqlite3 gemの2.xを利用可能になった。

Mike Dalessio

🔗 Allow ActiveRecord::Base#pluck to accept hash values by fatkodima · Pull Request #51565 · rails/rails

  • ActiveRecord::Base#pluckにハッシュ値を渡せるようになった。
# 改修前
Post.joins(:comments).pluck("posts.id", "comments.id", "comments.body")

# 改修後
Post.joins(:comments).pluck(posts: [:id], comments: [:id, :body])

fatkodima

Rails 7.2: ActiveRecord::Base#pluckにハッシュ値を渡せるようになった(翻訳)

🔗 Raise named exception in AbstractMysqlAdapter when DB reports an invalid version by kmcphillips · Pull Request #51478 · rails/rails

週刊Railsウォッチ20240416: AbstractMysqlAdapterで適切なエラーがraiseされるよう修正

  • MySQLデータベースが返すバージョン文字列が無効な場合はActiveRecord::ActiveRecordErrorをraiseするよう修正。

Kevin McPhillips

🔗 Allow to register transaction callbacks outside of a record by casperisfine · Pull Request #51474 · rails/rails

参考: 週刊Railsウォッチ20240416: トランザクションブロックの中で当該トランザクションのコールバックを登録可能になった

  • ActiveRecord::Base.transactionActiveRecord::Transactionオブジェクトをyieldするようになった。
Article.transaction do |transaction|
  article.update(published: true)
  transaction.after_commit do
    PublishNotificationMailer.with(article: article).deliver_later
  end
end

Jean Boussier

  • ActiveRecord::Base.current_transactionが追加された。

現在のトランザクションを返すことで、そこにコールバックを登録可能にする。

Article.current_transaction.after_commit do
  PublishNotificationMailer.with(article: article).deliver_later
end

Jean Boussier

🔗 Automatically delay Active Job enqueues to after commit by casperisfine · Pull Request #51426 · rails/rails

参考: 週刊Railsウォッチ20240416: ジョブのエンキューをトランザクション完了時まで自動先延ばしするようになった

  • ActiveRecord.after_all_transactions_commitコールバックを追加。

トランザクションの内部か外部のどちらかで実行される可能性のあるコードで、ステートの変更が適切に永続化されてから処理を実行しなければならない場合に有用。

def publish_article(article)
  article.update(published: true)
  ActiveRecord.after_all_transactions_commit do
    PublishNotificationMailer.with(article: article).deliver_later
  end
end

上のコード例のブロックは、トランザクションの外で呼び出されるとただちに実行されるか、オープントランザクションがコミットされた後に呼び出されるか、のどちらかになる。

トランザクションがロールバックした場合、ブロックは呼び出されない。

Jean Boussier

🔗 Add the ability to ignore counter cache columns while they are backfilling by fatkodima · Pull Request #51453 · rails/rails

参考: 週刊Railsウォッチ20240416: カウンタキャッシュからの読み出しをcounter_cache: { active: false }で制御できるようになった

  • カウンタキャッシュがバックフィルされるまでカウンタキャッシュカラムを無視できる機能を追加。

既存の巨大なテーブルでカウンタキャッシュを使い始めると厄介になることがある。カラムの追加とは別に、 :counter_cacheを使う前にはカラムの値をバックフィル(埋め戻し)しておかなければならない(テーブルが長時間ロックされないようにするために必要)。さもないと、内部カウンタキャッシュを利用しているsizeany?などのメソッドが誤った結果を生成する可能性がある。関連付けにカウンタキャッシュ構成を導入する前には、バックフィル中に子関連付けでデータベーストリガーまたはコールバックを使うことが多い。

改修の結果、子レコードの追加や削除のときに次のように書いておくことで、カラムを更新済みのままカラムを安全にバックフィルできるようになった。

class Comment < ApplicationRecord
  belongs_to :post, counter_cache: { active: false }
end

カウンタキャッシュが"active"でない場合、sizeany?などのメソッドはカウンタキャッシュを使わなくなり、データベースから直接結果を取得する。カウンタキャッシュのカラムでバックフィルが完了した後は、カウンタキャッシュの定義から{ active: false }を削除するだけで、sizeany?などのメソッドでカウンタキャッシュが使われるようになる。

fatkodima

🔗 Retry known idempotent SELECT queries on connection-related exceptions by adrianna-chang-shopify · Pull Request #51336 · rails/rails

参考: 週刊Railsウォッチ20240409: 特定のクエリメソッドやArelでallow_retryオプションを指定可能になった

  • コネクションに関連する例外で、冪等(べきとう: idempotent)であることがわかっているSELECTクエリをリトライできるようになった。

自分たち開発者がArelツリーをたどってビルドしたSELECTクエリや、モデルの既知の属性を用いてビルドしたSELECTクエリは冪等であり、コネクションエラー時でも安全にリトライできる。従来は、リクエスト中にコネクションエラーが発生するとTrilogyAdapterActiveRecord::ConnectionFailed: Trilogy::EOFErrorが発生することがあった。

Adrianna Chang

🔗 Allow association foreign_key to be an Array by nvasilevski · Pull Request #51334 · rails/rails

  • 関連付けのforeign_keyが複合可能になった。

従来、複合外部キーを設定するには、query_constraintsオプションにArrayを渡すしか方法がなかった。
この改修によって、Array値をforeign_keyとして渡すことで関連付けで同じ振る舞いを得られる。

Nikita Vasilevsky

🔗 Allow primary_key: association option to be composite by nvasilevski · Pull Request #51345 · rails/rails

  • 関連付けのprimary_keyが複合可能になった(配列を渡せるようになった)。

関連付けのprimary_keyは、関連付けられるモデルのprimary_keyまたはquery_constraintsから導出されたときに複合可能になる。
改修によって、関連付けのprimary_keyに明示的に複合として設定可能になった。

Nikita Vasilevsky

🔗 Add config.active_record.permanent_connection_checkout setting by casperisfine · Pull Request #51349 · rails/rails

参考: 週刊Railsウォッチ20240409: config.active_record.permanent_connection_checkoutが追加

config.active_record.permanent_connection_checkout設定が追加された。これは、ActiveRecord::Base.connectionが「エラーを発生させる」「非推奨警告を表示する」「どちらも行わない」のどれにするかを制御する。

ActiveRecord::Base.connectionは、そのコネクションのプールからデータベースコネクションをチェックアウトして、リクエストやジョブが完了するまでリース中(貸出中、専有中)のままにする。この振る舞いは、利用可能なコネクション数よりも多くのスレッドやfiberが使われる環境では望ましくない場合がある。

このActiveRecord::Base.connectionコンフィグを使うと、ActiveRecord::Base.connectionをトラッキングして削除し、ActiveRecord::Base.with_connectionを代わりに使う形で移行しようと思えばできるようになる。

このコンフィグのデフォルトの振る舞いは変更されておらず、現時点ではデフォルトの振る舞いを変更する予定はない。

Jean Boussier

🔗 Add dirties option to Model.uncached by djmb · Pull Request #51204 · rails/rails

参考: 週刊Railsウォッチ20240312: uncachedメソッドにdirtiesオプションを追加

  • uncachedメソッドにdirtiesオプションを追加。

true(デフォルト)に設定すると、書き込みで現在のスレッドに属するすべてのクエリキャッシュがクリアされる。
falseに設定すると、影響を受けるコネクションプールへの書き込みでクエリキャッシュがクリアされなくなる。

これは、Solid Cacheでキャッシュ書き込みによってクエリキャッシュがクリアされないようにするために必要。

Donal McBreen

🔗 Deprecate ConnectionPool#connection by casperisfine · Pull Request #51230 · rails/rails

参考: 週刊Railsウォッチ20240312: RailsのテストスイートにあるBase.connectionwith_connectionlease_connectionに置き換えた

  • ActiveRecord::Base.connectionが非推奨化、今後は.lease_connectionを利用すること。

メソッド名がlease_connectionにリネームされ、返されたコネクションがリクエストやジョブの処理中は維持されることがより明確になった。

これはソフトな非推奨化であり、警告は表示されない。また、このメソッドを削除する予定も今のところない。

Jean Boussier

  • ActiveRecord::ConnectionAdapters::ConnectionPool#connectionを非推奨化。

メソッド名がlease_connectionにリネームされ、返されたコネクションがリクエストやジョブの処理中は維持されることがより明確になった。

Jean Boussier

🔗 Expose a generic fixture accessor for fixture names that may conflict with Minitest by casperisfine · Pull Request #51213 · rails/rails

参考: 週刊Railsウォッチ20240312: 汎用のfixtureアクセサを追加

  • minitestと競合する可能性のあるfixture名に対応するため、汎用のfixtureアクセサを公開する。
assert_equal "Ruby on Rails", web_sites(:rubyonrails).name
assert_equal "Ruby on Rails", fixture(:web_sites, :rubyonrails).name

Jean Boussier

🔗 [Fix #51164] Model.query_constraints with single non-primary-key column raises incorrect error by joshuay03 · Pull Request #51165 · rails/rails

参考: 週刊Railsウォッチ20240312: 主キーでない単一のカラムでModel.query_constraintsのエラーメッセージを修正

  • 主キーでない単一のカラムでModel.query_constraintsをraiseされるのは期待通りだが、そのエラーメッセージが正しくなかった。

適切なエラーメッセージを表示するよう修正した。

Joshua Young

🔗 [Fix #50897] Autosaving has_one sets foreign key attribute when unchanged by joshuay03 · Pull Request #50901 · rails/rails

参考: 週刊Railsウォッチ20240306: has_one関連付けの自動保存のバグを修正

外部キー属性が変更されていない場合に設定されるhas_one関連付けの自動保存を修正。

この振る舞いはbelongs_toの自動保存とも一貫しておらず、外部キー属性がread-onlyとマーキングされている場合にActiveRecord::ReadOnlyAttributeErrorなどの意図しない副作用が発生する可能性がある。

Joshua Young

🔗 (削除)Active Record commit transaction on return, break and throw by casperisfine · Pull Request #48600 · rails/rails

参考: Rails 7.1.0 Active Record CHANGELOG(翻訳)
参考: 週刊Railsウォッチ20230809: トランザクションがreturn、break、throwでコミットするようになった

  • トランザクションブロックをreturnbreak、またはthrowで終了したときにロールバックする非推奨の振る舞いを削除。

Rafael Mendonça França

  • Rails.application.config.active_record.commit_transaction_on_non_local_returnを非推奨化。

Rafael Mendonça França

🔗 (削除)Deprecate passing rewhere to merge by HParker · Pull Request #45498 · rails/rails

  • ActiveRecord::Relation#mergerewhereオプションを渡す非推奨化サポートを削除。

Rafael Mendonça França

参考: 週刊Railsウォッチ20230913: mergerewhereオプションを渡すことが非推奨化された

🔗 (削除)Deprecate deferrable: true option of add_foreign_key by alpaca-tc · Pull Request #47659 · rails/rails

  • add_foreign_keydeferrable: trueを渡せる非推奨化サポートを削除。

Rafael Mendonça França

参考: 週刊Railsウォッチ20230524: add_foreign_keydeferrable: trueオプションを非推奨化する

🔗 (削除)Deprecate quoting ActiveSupport::Duration as an integer (#44341) by aramgre · Pull Request #44438 · rails/rails

参考: Rails 7.1.0 Active Record CHANGELOG(翻訳) -- ActiveSupport::Durationを整数値として式展開することを非推奨化

  • ActiveSupport::Durationを整数値として式展開する非推奨化サポートを削除。

Rafael Mendonça França

🔗 (削除)Bring back quote_bound_value & deprecate instead by matthewd · Pull Request #47247 · rails/rails

  • 非推奨化されていた#quote_bound_valueを削除。

Rafael Mendonça França

🔗 (削除)Fix granular swapping for primary_abstract_class by eileencodes · Pull Request #45621 · rails/rails

  • 非推奨化されていたActiveRecord::ConnectionAdapters::ConnectionPool#connection_klassを削除。

Rafael Mendonça França

🔗 (削除)Make connection_pool_list take an explicit argument by eileencodes · Pull Request #45961 · rails/rails

  • role引数が指定されていない場合に以下を現在のロールのコネクションプールに適用する非推奨サポートを削除。
    • #connection_pool_list
    • #active_connections?
    • #clear_active_connections!
    • #clear_reloadable_connections!
    • #clear_all_connections!
    • #flush_idle_connections!

Rafael Mendonça França

  • 非推奨化されていた#all_connection_poolsを削除。

Rafael Mendonça França

🔗 (削除)Refactor Active Record Schema Cache to not hold a connection by casperisfine · Pull Request #48716 · rails/rails

  • 非推奨化されていたActiveRecord::ConnectionAdapters::SchemaCache#data_sourcesを削除。

Rafael Mendonça França

  • 非推奨化されていたActiveRecord::ConnectionAdapters::SchemaCache.load_fromを削除。

Rafael Mendonça França

🔗 (削除)Show reason for foreign key error when loading fixtures by ghiculescu · Pull Request #47990 · rails/rails

参考: 週刊Railsウォッチ20230502: fixture読み込み時の外部キーエラーの理由を表示するようになった

  • 非推奨化されていた#all_foreign_keys_valid?をデータベースアダプタから削除。

Rafael Mendonça França

🔗 (削除)Allow to define the default column serializer by casperisfine · Pull Request #47463 · rails/rails

参考: 週刊Railsウォッチ20230314: デフォルトのカラムシリアライザを定義可能になった

  • serializeの第2引数にコーダーやクラスを渡せる非推奨化サポートを削除。

Rafael Mendonça França

🔗 (削除)Deprecate read_attribute(:id) returning the primary key by adrianna-chang-shopify · Pull Request #49019 · rails/rails

参考: 週刊Railsウォッチ20230906: 主キーが:idでない場合に主キーを返すread_attribute(:id)を非推奨化

  • ActiveRecord::Base#read_attribute(:id)がカスタム主キーの値を返す非推奨化サポートを削除。

Rafael Mendonça França

🔗 (削除)Introduce TestFixtures#fixture_paths by andrewn617 · Pull Request #47675 · rails/rails

参考: 週刊Railsウォッチ20230405: fixtureパスをRailsエンジン単位で指定可能になった
参考: 週刊Railsウォッチ20230412: TestFixturesincludeするたびにloadフックを実行するように修正
参考: 週刊Railsウォッチ20230613: fixture_pathsにエンジンのtest/fixturesを自動追加するようになった

  • 非推奨化されていたTestFixtures.fixture_path(単数形)を削除。

Rafael Mendonça França

🔗 (削除)Add configurable deprecation warning for singular associations by HParker · Pull Request #45344 · rails/rails

参考: 週刊Railsウォッチ20220704: 関連付け先の単数形の名前をwhere内から複数形で参照すると警告を出す

  • 単数形の関連付け名を複数形の名前で参照できる非推奨化された振る舞いを削除。

Rafael Mendonça França

  • Rails.application.config.active_record.allow_deprecated_singular_associations_nameを非推奨化。

Rafael Mendonça França

🔗 (削除)Minor refactoring to schema migration and internal metadata by eileencodes · Pull Request #46010 · rails/rails

  • ActiveRecord::MigrationContextの第2引数にSchemaMigrationクラスやInternalMetadataクラスを渡せる非推奨サポートを削除。

Rafael Mendonça França

🔗 (削除)Deprecate check_pending! in favor of check_all_pending! by eileencodes · Pull Request #48134 · rails/rails

  • 非推奨化されていたActiveRecord::Migration.check_pendingメソッドを削除。

Rafael Mendonça França

🔗 (削除)Fix Active Record :db_runtime metric by casperisfine · Pull Request #46041 · rails/rails

  • 非推奨化されていたActiveRecord::LogSubscriber.runtimeメソッドを削除。

Rafael Mendonça França

  • 非推奨化されていたActiveRecord::LogSubscriber.runtime=メソッドを削除。

Rafael Mendonça França

  • 非推奨化されていたActiveRecord::LogSubscriber.reset_runtimeメソッドを削除。

Rafael Mendonça França

🔗 (削除)ActiveRecord::Relation#explain accepts options by reid-rigo · Pull Request #47043 · rails/rails

  • コネクションアダプタ内でexplainに2つの引数を渡せる非推奨化サポートを削除。

Rafael Mendonça França

🔗 (削除)Defer constant loading of ActiveRecord::DestroyAssociationAsyncJob via a String instead of a class constant by bensheldon · Pull Request #45476 · rails/rails

  • 非推奨化されていたActiveRecord::ActiveJobRequiredErrorを削除。

Rafael Mendonça França

🔗 (削除)Deprecate delegation to connection handler from Base by eileencodes · Pull Request #46274 · rails/rails

  • 非推奨化されていたActiveRecord::Base.clear_active_connections!を削除。

Rafael Mendonça França

  • 非推奨化されていたActiveRecord::Base.clear_reloadable_connections!を削除。

Rafael Mendonça França

  • 非推奨化されていたActiveRecord::Base.clear_all_connections!を削除。

Rafael Mendonça França

  • 非推奨化されていたActiveRecord::Base.flush_idle_connections!を削除。

Rafael Mendonça França

🔗 (削除)Deprecate name argument in remove_connection by eileencodes · Pull Request #48681 · rails/rails

  • ActiveRecord::Base.remove_connectionで非推奨化されていたname引数を削除。

Rafael Mendonça França

🔗 (削除)Call proxy methods from alias_attribute generated methods by nvasilevski · Pull Request #48533 · rails/rails

  • alias_attributeに存在しない属性名を渡して呼び出せる非推奨化サポートを削除。

Rafael Mendonça França

🔗 (削除)Facilitate use of any regular ERB in database.yml by eikes · Pull Request #46134 · rails/rails

  • 非推奨化されていたRails.application.config.active_record.suppress_multiple_database_warningを削除。

Rafael Mendonça França

🔗 Add MessagePackMessageSerializer for binary data by djmb · Pull Request #51102 · rails/rails

  • ActiveRecord::Encryption::MessagePackMessageSerializerを追加。

データをMessagePack形式にシリアライズする(バイナリカラムに効率よく保存できるため)。

このバイナリエンコーディングで必要な容量は、デフォルトのシリアライザで使われるBase64エンコーディングと比較して30%少なく済む。

Donal McBreen

🔗 Support encrypting binary columns by djmb · Pull Request #50920 · rails/rails

参考: 週刊Railsウォッチ20240228: バイナリカラムの暗号化をサポート

  • バイナリカラムの暗号化をサポート

暗号化と復号でバイナリデータをType::Binary::Dataで受け渡しするようにする。

従来は、バイナリカラムをActiveRecord::Encryption::MessageSerializerで暗号化すると、MySQLやSQLiteでは動作するがPostgreSQLでは動作しなかった。

Donal McBreen

🔗 Remove initializer that was eager loading the schema cache dump by rafaelfranca · Pull Request #51034 · rails/rails

  • データベース設定でのENV["SCHEMA_CACHE"]の利用が非推奨化された。今後は schema_cache_pathを使うこと。

Rafael Mendonça França

🔗 Add ActiveRecord::Base.with_connection as a shortcut by casperisfine · Pull Request #51083 · rails/rails

参考: 週刊Railsウォッチ20240228: ActiveRecord::Base.with_connectionを追加

  • コネクションを短い時間だけリースするショートカットとしてActiveRecord::Base.with_connectionを追加する。

リースされたコネクションがyieldされると、ブロックの実行中はActiveRecord::Base.connectionで同じコネクションがyieldされる。

これは、リクエストやジョブの継続中コネクションをリースし続けることなく、複数のデータベース操作を実行したい場合に有用。

Jean Boussier

🔗 Deprecate config.active_record.warn_on_records_fetched_greater_than by hundredwatt · Pull Request #51007 · rails/rails

  • config.active_record.warn_on_records_fetched_greater_than を非推奨化(sql.active_recordの通知に:row_countフィールドが含まれるようになったことを受けて)。

Jason Nochlin

🔗 Fix override existing join types in the query in the where.associated method by saleh-alhaddad · Pull Request #51078 · rails/rails

参考: 週刊Railsウォッチ20240306: where.associatedのバグを修正

この修正によって、スコープ内の既存のJOINに基づいて、適切なJOIN種別(INNER JOINまたはLEFT OUTER JOIN)を用いて関連付けがJOINされるようになる。

これにより、既存のJOIN種別が意図せずオーバーライドされることを防ぎ、一貫したSQLクエリが生成されるようになる。

例:

# `associated`では`JOIN`ではなく`LEFT JOIN`が使われる
Post.left_joins(:author).where.associated(:author)

Saleh Alhaddad

🔗 [Fix #50604] Restore compatibility of Active Record Encryption configs with eager loading mode by maximerety · Pull Request #50606 · rails/rails

アプリケーションがeager loadingされるときに、Active Recordモデルが読み込まれる前にActiveRecord::Encryptionコンフィグが準備されない問題を修正。このために暗号化属性が誤って設定されるケースが生じていた。

Maxime Réty

🔗 Deprecate defining enums with keywords args by skipkayhil · Pull Request #50987 · rails/rails

  • enumの定義でキーワード引数を利用することが非推奨化された。
class Function > ApplicationRecord
  # BAD
  enum color: [:red, :blue],
       type: [:instance, :class]

  # GOOD
  enum :color, [:red, :blue]
  enum :type, [:instance, :class]
end

Hartley McGuire

🔗 Add active_record.config.validate_migration_timestamps config option. by adrianna-chang-shopify · Pull Request #50400 · rails/rails

  • config.active_record.validate_migration_timestampsオプションを追加(マイグレーションのタイムスタンプをバリデーションするかどうかを指定)

このオプションが設定されると、マイグレーションのタイムスタンプのプレフィックスが、現在の時刻に関連付けられたタイムスタンプから1日以内に収まることをバリデーションする。これは、マイグレーションのプレフィックスを手動で未来のタイムスタンプに編集したときに、マイグレーションの生成などのマイグレーションコマンドに影響するのを防ぐために設計されている。

Adrianna Chang

🔗 Properly synchronize Mysql2Adapter#active? and TrilogyAdapter#active? by casperisfine · Pull Request #51012 · rails/rails

参考: 週刊Railsウォッチ20240221: Mysql2Adapter#active?TrilogyAdapter#active?が正しく同期するよう修正

  • Mysql2Adapter#active?TrilogyAdapter#active?が正しく同期するよう修正

disconnect!verify!についても同様。

コネクションはスレッド間で共有されないはずなので、これは一般に大きな問題ではないが、トランザクションテストやシステムテストを実行する場合にはこれが要求されるため、SEGVが発生する可能性がある。

Jean Boussier

🔗 Support :source_location tag option for query log tags by fatkodima · Pull Request #50969 · rails/rails

参考: 週刊Railsウォッチ20240221: クエリログで:source_locationをサポート

  • クエリログのタグで:source_locationタグオプションをサポート
config.active_record.query_log_tags << :source_location

呼び出し元の計算はコストの高い操作なので、基本的にdevelopment環境で使う(同じ目的を果たすconfig.active_record.verbose_query_logsもあることに注意)べき。production環境でデバッグ目的に使う場合は短期間にとどめるべき。

fatkodima

🔗 Allow encryption without compression by djmb · Pull Request #50876 · rails/rails

参考: 週刊Railsウォッチ20240221: ActiveRecord::Encryptionの暗号化で圧縮をオフにできるようになった

  • 圧縮を無効にするオプションをActiveRecord::Encryption::Encryptorに追加する。

compress: falseを設定することで、圧縮を無効にできる

class User
  encrypts :name, encryptor: ActiveRecord::Encryption::Encryptor.new(compress: false)
end

Donal McBreen

🔗 Unify the logic to determine the default schema cache path for a database configuration by rafaelfranca · Pull Request #50893 · rails/rails

  • ActiveRecord::Tasks::DatabaseTasks.https://github.com/marvin-bitterlichcache_dump_filenameに文字列を渡すことを非推奨化

ActiveRecord::DatabaseConfigurations::DatabaseConfigオブジェクトを渡すべき。

Rafael Mendonça França

🔗 Add row_count field to sql.active_record notification by marvin-bitterlich · Pull Request #50887 · rails/rails

参考: 週刊Railsウォッチ20240221: ActiveSupport::Notificationssql.active_recordrow_countフィールドを追加

  • sql.active_record通知にrow_countフィールドを追加

このフィールドは、通知を発行したクエリによって返された行数を返す。

このメトリクスは、大きな結果セットを含むクエリを検出したい場合に有用。

Marvin Bitterlich

🔗 [Fix #50803] Consistently raise an ArgumentError when passing an invalid argument to a nested attributes association writer by joshuay03 · Pull Request #50804 · rails/rails

参考: 週刊Railsウォッチ20240215: NestedAttributesで、渡した引数の種類によってエラーメッセージが異なっていたのを修正

  • ネステッド属性関連付けライター(writer)に無効な引数を渡すと、常にArgumentErrorが発生するよう修正

従来、このエラーはコレクション(複数形)の関連付けでしか発生せず、単数形の関連付けでは一般的なエラーを発生していた。

修正後は、コレクションと単数形の両方の関連付けでArgumentErrorが発生するようになった。

Joshua Young

🔗 Fix single quote escapes on default generated MySQL columns by yash · Pull Request #50733 · rails/rails

  • デフォルトで生成されるMySQLカラムの一重引用符が二重エスケープされていたのを修正。

MySQL 5.7.5 以降では、式から計算されるカラム作成に利用可能な生成カラム(generated column)がサポートされている。

修正前のスキーマダンプでは、デフォルトの式で生成カラムが一重引用符''を含んでいると、二重エスケープされた文字列を出力していた。

これにより、MySQLデータベースの新しいインスタンスにスキーマをインポートするときに問題が発生していた。

修正後は文字列がエスケープされず、スキーマのインポート時に有効な Rubyコードになる。

Yash Kapadia

🔗 Fix add_reference options validated on < 7.1 by skipkayhil · Pull Request #50680 · rails/rails

注: この修正はRails 7.1.3で既にリリースされていますが、このChangelogに修正が加えられています。

  • マイグレーションのバージョンが7.1よりも古い場合にadd_referencet.referencesで指定されるオプションがバリデーションされていたのを修正

Hartley McGuire

🔗 Define a class method to introspect valid delegatable types so they can by jprosevear · Pull Request #50662 · rails/rails

参考: 週刊Railsウォッチ20240215: ActiveRecord::DelegatedType<role>_typesクラスメソッドが追加

  • DelegatedTypeのイントロスペクションを可能にするため、<role>_typesクラスメソッドを ActiveRecord::DelegatedTypeに追加する

JP Rosevear

🔗 Make schema_dump, query_cache, replica and database_tasks configurable via DATABASE_URL by casperisfine · Pull Request #50757 · rails/rails

参考: 週刊Railsウォッチ20240215: schema_dumpなどをDATABASE_URLでコンフィグ可能になった

  • DATABASE_URLschema_dumpquery_cachereplicadatabase_tasksを設定可能になった

従来は、ブーリアン値が文字列として解釈されたせいで設定できない場合があった。

改修後は、DATABASE_URL=postgres://localhost/foo?schema_dump=falseのように書けばスキーマキャッシュのダンプを正しく無効にできるようになった。

Mike Coutermarsh, Jean Boussier

🔗 Fix [#50260] Support :on option in #set_callback by joshuay03 · Pull Request #50261 · rails/rails

参考: 週刊Railsウォッチ20240206: after_commitコールバックやafter_rollbackコールバックでon: :updateなどを指定可能になった

  • ActiveRecord::Transactions::ClassMethods#set_callbackを導入

このクラスメソッドは、after_commitコールバックやafter_rollbackコールバックで:onオプションをサポートする他は、ActiveSupport::Callbacks::ClassMethods#set_callbackと同一。

Joshua Young

🔗 [Fix #48685] Make the encryptor agnostic of the type of data to decrypt · rails/rails@d0f3b00

  • ActiveRecord::Encryption::Encryptorが、暗号化データで使われるシリアライズ形式に影響されないようになった

修正前の暗号化インスタンスでは、Stringとしてシリアライズされた暗号化済み値でなければメッセージシリアライザに渡せなかった。

修正後は、でサポートされる暗号化済みシリアライズ値の型が、指定したmessage_serializerによって決定されるようになった。これにより、カスタムシリアライザがString以外の型を指定してActiveRecord::Encryption::Messageオブジェクトをシリアライズ可能になった。

既にデフォルトのActiveRecord::Encryption::MessageSerializerでは、デシリアライズでStringオブジェクトだけが渡されるようになっている。

Maxime Réty

🔗 [Fix #48922] Honour encrypted attribute context in encrypted_attribute? by maximerety · Pull Request #48923 · rails/rails

注: この修正はRails 7.1.3で既にリリースされています。

  • encryptsに渡したコンテキストプロパティがencrypted_attribute?で考慮されるよう修正。

Maxime Réty

🔗 Add explain support for methods like last, pluck and count by p8 · Pull Request #50482 · rails/rails

参考: 週刊Railsウォッチ20240206: lastpluckcountなどでもexplainを使えるようになった

  • explainが返すオブジェクトがpluckfirstlastaveragecountmaximumminimumsumに応答するようになった

これらの新しいメソッドは、対応するクエリでEXPLAINを実行する。

User.all.explain.count
# EXPLAIN SELECT COUNT(*) FROM `users`
# ...

User.all.explain.maximum(:id)
# EXPLAIN SELECT MAX(`users`.`id`) FROM `users`
# ...

Petrik de Heus

🔗 Pass validation_context to validates_associated by austenmadden · Pull Request #46238 · rails/rails

-validates_associatedが使われる場合は:onオプションでバリデーションするよう修正

関連付けられるレコードのバリデーションでvalidates_associated :onオプションが考慮されていなかった問題を修正。

Austen Madden, Alex Ghiculescu, Rafał Brize

🔗 Allow overriding SQLite defaults from database.yml by fractaledmind · Pull Request #50460 · rails/rails

  • database.ymlでSQLiteのデフォルト設定をオーバーライド可能になった

database.yml設定ファイル内のpragmasキー以下に書いたPRAGMA設定がRailsのデフォルトより優先されるようになり、追加のPRAGMAも設定されるようになった。

database: storage/development.sqlite3
timeout: 5000
pragmas:
  journal_mode: off
  temp_store: memory

Stephen Margheim

🔗 Remove SQLite production warning but leave production config disabled by byroot · Pull Request #50463 · rails/rails

  • SQLiteをproduction環境で実行するときの警告メッセージを表示するのをやめ、SQLiteを未設定のままにするようになった

SQliteをproduction環境で実行する有効なユースケースはいくつもあるが、利用は慎重に行わなければならない。そこで、ほとんどのユーザーが見ることのない警告を表示するよりも、SQLiteコンフィグをコメントアウトしたままにすることで、データベースを何らかの永続化ボリュームに置くことをユーザーに強制的に考えさせる方が望ましい。

Jacopo Beschi, Jean Boussier

🔗 Add support for generated columns in SQLite3 adapter by fractaledmind · Pull Request #49346 · rails/rails

参考: 週刊Railsウォッチ20240117: SQLite3アダプタに生成カラム(generated columns)のサポートを追加

  • SQLite3アダプタに生成カラムのサポートを追加

生成カラムは(storedおよびdynamicの両方について)SQLite 3.31.0以降でサポートされている。
このプルリクは、SQLite3アダプタにそうしたサポートを追加する。

create_table :users do |t|
  t.string :name
  t.virtual :name_upper, type: :string, as: 'UPPER(name)'
  t.virtual :name_lower, type: :string, as: 'LOWER(name)', stored: true
end

Stephen Margheim

🔗 TrilogyAdapter: ignore host if socket is set by casperisfine · Pull Request #50349 · rails/rails

参考: 週刊Railsウォッチ20240117: TrilogyAdapterでDATABASE_URLにUNIXソケットを指定可能になった

  • TrilogyAdapterでsocketパラメータが設定済みの場合はhostを無視するようになった

これにより、DATABASE_URL経由でUNIXソケット上にコネクションを設定可能になる。

DATABASE_URL=trilogy://does-not-matter/my_db_production?socket=/var/run/mysql.sock

Jean Boussier

🔗 Expose assert_queries_match and assert_no_queries_match assertions by fatkodima · Pull Request #50373 · rails/rails

参考: 週刊Railsウォッチ20240123: assert_queries_countassert_no_queriesassert_queries_matchassert_no_queries_matchアサーションを公開

以下のアサーションをpublicにした:

  • assert_queries_count
  • assert_no_queries
  • assert_queries_match
  • assert_no_queries_match

期待される件数のクエリが作成されるというアサーションのため、Rails 内部で assert_queries_countassert_no_queriesが使われている。特定のSQLクエリが作成されたというアサーションには、assert_queries_matchassert_no_queries_matchが使われている。これらのアサーションがアプリケーションでも利用可能になった。

class ArticleTest < ActiveSupport::TestCase
  test "queries are made" do
    assert_queries_count(1) { Article.first }
  end

  test "creates a foreign key" do
    assert_queries_match(/ADD FOREIGN KEY/i, include_schema: true) do
      @connection.add_foreign_key(:comments, :posts)
    end
  end
end

Petrik de Heus, fatkodima

🔗 [Fix #49874] has_secure_token calls the setter method on initialize by abeidahmed · Pull Request #50251 · rails/rails

注: この修正はRails 7.1.3でリリース済みです。

  • 初期化時にhas_secure_tokenがセッターメソッドを呼び出すよう修正。

Abeid Ahmed

🔗 Add a ActiveRecord.protocol_adapters configuration to map DATABASE_URL protocols to adapters at an application level by kmcphillips · Pull Request #50140 · rails/rails

参考: 週刊Railsウォッチ20231222: MySQLでDATABASE_URLを変えずにconfig.active_record.protocol_adapters.mysqlでアダプタを指定できるようになった

DATABASE_URL環境変数を使う場合、URLに含まれるプロトコル名を特定のデータベースアダプタにマッピングする設定を有効にした。これにより、アプリケーションで利用するために選択するアダプタを、デプロイ環境で設定されるデータベースコネクションの詳細から分離できるようになる。

# ENV['DATABASE_URL'] = "mysql://localhost/example_database"
config.active_record.protocol_adapters.mysql = "trilogy"
# will connect to MySQL using the trilogy adapter

Jean Boussier, Kevin McPhillips

🔗 Handle case in MySQL where the ActiveRecord.db_warnings_action is not called even when a DB query has warnings by kmcphillips · Pull Request #50049 · rails/rails

参考: 週刊Railsウォッチ20231213: MySQLクエリでwarningが発生してもActiveRecord.db_warnings_actionが呼び出されないケースを修正

MySQLが返すwarning_countがゼロより大きく、SHOW WARNINGSクエリを実行しても警告が表示されない場合に、ActiveRecord.db_warnings_actionを呼び出しても警告を無視せずに一般的な警告メッセージを表示するよう修正。

Kevin McPhillips

🔗 DatabaseConfigurations#configs_for can accept a symbol in the name param by andrewn617 · Pull Request #50061 · rails/rails

  • DatabaseConfigurations#configs_fornameパラメータにシンボルを渡せるようになった

Andrew Novoselac

🔗 [Fix #48535]: fix behavior of proc_for_binds in Arel::Nodes::HomogenousIn by JohnAnon9771 · Pull Request #49050 · rails/rails

参考: 週刊Railsウォッチ20231122: Arelのproc_for_bindsの振る舞いを修正

  • where(field: values)クエリで、fieldがシリアライズド属性の場合(fieldActiveRecord::Base.serializeを使っている場合や、fieldがJSONカラムの場合など)の振る舞いを修正した。

João Alves

🔗 Make the output of ActiveRecord::Core#inspect configurable. by andrewn617 · Pull Request #49765 · rails/rails

参考: 週刊Railsウォッチ20231122: ActiveRecord::Core#inspectの出力をカスタマイズ可能になった

  • ActiveRecord::Core#inspectの出力をカスタマイズ可能になった

デフォルトでは、あるレコードでinspectを呼び出すと、idのみを含むフォーマット済み文字列が生成される。

Post.first.inspect #=> "#<Post id: 1>"

inspectの出力に含めたい属性があれば、ActiveRecord::Core#attributes_for_inspectで設定できる。

Post.attributes_for_inspect = [:id, :title]
Post.first.inspect #=> "#<Post id: 1, title: "Hello, World!">"

attributes_for_inspect:allに設定すると、inspectでレコードの全属性が出力される。

Post.attributes_for_inspect = :all
Post.first.inspect #=> "#<Post id: 1, title: "Hello, World!", published_at: "2023-10-23 14:28:11 +0000">"

attributes_for_inspectは、development環境とtest環境ではデフォルトで:allに設定される。
full_inspectを呼び出すことで全属性をinspectすることも可能。
attribute_for_inspectで設定した属性はpretty_printでも使われる。

Andrew Novoselac

🔗 Don't mark Float::INFINITY as changed if didn't by MaicolBen · Pull Request #49904 · rails/rails

参考: 週刊Railsウォッチ20231122: 変更されていないFloat::INFINITY値をchangedとして保存しないよう修正

  • Float::INFINITY-Float::INFINITYに再代入したときに属性をchangedにしないようになった

Maicol Bentancor

🔗 Support RETURNING clause for MariaDB by fatkodima · Pull Request #49840 · rails/rails

参考: 週刊Railsウォッチ20231114: MariaDBでRETURNINGをサポート

  • MariaDBでRETURNINGをサポート

fatkodima, Nikolay Kondratyev

🔗 The SQLite3 adapter now implements the supports_deferrable_constraints? contract by fractaledmind · Pull Request #49376 · rails/rails

参考: 週刊Railsウォッチ20231114: SQLite3にsupports_deferrable_constraints?を追加

  • SQLite3アダプタでsupports_deferrable_constraints?コントラクトを実装

これにより、foreign_keyオプションに:deferrableキーを追加すれば外部キーをdeferredにできる。

add_reference :person, :alias, foreign_key: { deferrable: :deferred }
add_reference :alias, :person, foreign_key: { deferrable: :deferred }

Stephen Margheim

🔗 Add set_constraints helper for PostgreSQL by ccutrer · Pull Request #49187 · rails/rails

参考: 週刊Railsウォッチ20231114: PostgreSQL向けのset_constraintsヘルパーを追加

  • PostgreSQLコネクションに set_constraintsヘルパーを追加
Post.create!(user_id: -1) # => ActiveRecord::InvalidForeignKey

Post.transaction do
  Post.connection.set_constraints(:deferred)
  p = Post.create!(user_id: -1)
  u = User.create!
  p.user = u
  p.save!
end

Cody Cutrer

🔗 Include ActiveModel::API in ActiveRecord::Base by seanpdoyle · Pull Request #49680 · rails/rails

  • ActiveModel::APIActiveRecord::Baseincludeするようになった

Sean Doyle

🔗 Ensure #signed_id outputs url_safe strings by terracatta · Pull Request #49507 · rails/rails

  • #signed_idが出力する文字列がurl_safeになるよう修正

Jason Meller

🔗 Arel nulls first/last implementation Mysql by tttffff · Pull Request #50079 · rails/rails

参考: 週刊Railsウォッチ20240117: MySQLでArelのnulls_firstとnulls_lastが使えるようになった

  • MySQLにnulls_lastを追加し、desc.nulls_firstも動作するようにした

Tristan Fellows

🔗 ActiveRecord::Relation#order supports hash like ActiveRecord::Relation#where by mylesboone · Pull Request #50000 · rails/rails

  • ActiveRecord::Relationorderで、whereと同様のハッシュ渡しをサポート
Topic.includes(:posts).order(posts: { created_at: :desc })

Myles Boone

関連記事

Rails 7.1.0 Active Record CHANGELOG(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。