Rails 7.2.0 Active Record CHANGELOG(全項目リンク付き)
更新112件(うち非推奨削除29件)
Rails 7.2.0.rc1 (2024/08/07)
🔗 Fix SQLite table definition parsing bug to handle commas in default function definitions by fractaledmind · Pull Request #50838 · rails/rails
SQLiteのデフォルトの関数定義でカンマを処理するよう修正。
Stephen Margheim
🔗 [Rails 7.2.0.beta3] Fix bug with indexed nested error for singular associations by spickermann · Pull Request #52416 · rails/rails
関連付けが1個設定され、index_nested_attribute_errors
コンフィグが有効な場合にvalidates_associated
が例外を発生する問題を修正。
Martin Spickermann
参考: 3.8.31 config.active_record.index_nested_attribute_errors
-- Rails アプリケーションの設定項目 - Railsガイド
🔗 Deprecate ActiveRecord::ImmutableRelation · rails/rails@cc298de
ActiveRecord::ImmutableRelation
定数は、より強い「イミュータブルなリレーション」の意味を表すために名前を予約しておきたいため、非推奨とした。今後はActiveRecord::UnmodifiableRelation
を使うこと。
Xavier Noria
Rails 7.2.0.beta3 (2024/07/11)
🔗 Add condensed #inspect for Pool, Adapter, Config by skipkayhil · Pull Request #50405 · rails/rails
ConnectionPool
とAbstractAdapter
とDatabaseConfig
にスリムな#inspect
を追加
Hartley McGuire
🔗 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
Rails 7.2.0.beta2 (2024/06/04)
🔗 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
Rails 7.2.0.beta1 (2024/05/29)
🔗 [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
でsqlite3
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
🔗 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_count
assert_no_queries
assert_queries_match
assert_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
概要
MITライセンスに基づいて翻訳・公開いたします。
なお、機能削除のエントリについては、原則として7.2での削除プルリクではなく、その機能が非推奨化されたときの過去のプルリクへリンクしています。