
Rails 7.2.0 Active Record CHANGELOG(全項目リンク付き)
更新103件(うち非推奨削除29件)
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
修正前は、この#postがNested::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_batchesでtouch_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_tableでvalidate_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されなくなって振る舞いが期待通りになり、firstやlastなどのメソッド呼び出しで順序が一定にならない問題を防止する。firstやlastそれ自体は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
Sqlite3Adapterでsqlite3gemの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
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.transactionがActiveRecord::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を使う前にはカラムの値をバックフィル(埋め戻し)しておかなければならない(テーブルが長時間ロックされないようにするために必要)。さもないと、内部カウンタキャッシュを利用しているsizeやany?などのメソッドが誤った結果を生成する可能性がある。関連付けにカウンタキャッシュ構成を導入する前には、バックフィル中に子関連付けでデータベーストリガーまたはコールバックを使うことが多い。
改修の結果、子レコードの追加や削除のときに次のように書いておくことで、カラムを更新済みのままカラムを安全にバックフィルできるようになった。
class Comment < ApplicationRecord
belongs_to :post, counter_cache: { active: false }
end
カウンタキャッシュが"active"でない場合、sizeやany?などのメソッドはカウンタキャッシュを使わなくなり、データベースから直接結果を取得する。カウンタキャッシュのカラムでバックフィルが完了した後は、カウンタキャッシュの定義から{ active: false }を削除するだけで、sizeやany?などのメソッドでカウンタキャッシュが使われるようになる。
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クエリは冪等であり、コネクションエラー時でも安全にリトライできる。従来は、リクエスト中にコネクションエラーが発生するとTrilogyAdapterでActiveRecord::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.connectionをwith_connectionやlease_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でコミットするようになった
- トランザクションブロックを
return、break、または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#mergeにrewhereオプションを渡す非推奨化サポートを削除。
Rafael Mendonça França
参考: 週刊Railsウォッチ20230913: mergeにrewhereオプションを渡すことが非推奨化された
(削除)Deprecate deferrable: true option of add_foreign_key by alpaca-tc · Pull Request #47659 · rails/rails
add_foreign_keyにdeferrable: trueを渡せる非推奨化サポートを削除。
Rafael Mendonça França
参考: 週刊Railsウォッチ20230524: add_foreign_keyのdeferrable: 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: TestFixturesをincludeするたびに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::Notificationsのsql.active_recordにrow_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_referenceやt.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_URLでschema_dump、query_cache、replica、database_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: last、pluck、countなどでもexplainを使えるようになった
explainが返すオブジェクトがpluck、first、last、average、count、maximum、minimum、sumに応答するようになった
これらの新しいメソッドは、対応するクエリで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
以下のアサーションをpublicにした:
assert_queries_countassert_no_queriesassert_queries_matchassert_no_queries_match
期待される件数のクエリが作成されるというアサーションのため、Rails 内部で assert_queries_countやassert_no_queriesが使われている。特定のSQLクエリが作成されたというアサーションには、assert_queries_matchやassert_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
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_forのnameパラメータにシンボルを渡せるようになった
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がシリアライズド属性の場合(fieldでActiveRecord::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::APIをActiveRecord::Baseでincludeするようになった
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::Relationのorderで、whereと同様のハッシュ渡しをサポート
Topic.includes(:posts).order(posts: { created_at: :desc })
Myles Boone
関連記事
The post Rails 7.2.0 Active Record CHANGELOG(全項目リンク付き) first appeared on TechRacho.

概要
MITライセンスに基づいて翻訳・公開いたします。
Rails 7.2.0リリース後に必要であれば更新します。
なお、機能削除のエントリについては、原則として7.2での削除プルリクではなく、その機能が非推奨化されたときの過去のプルリクへリンクしています。