2020/03/19分のコミットです。
CHANGELOGにのったコミットは以下の通りです。
- Deprecate using
return,breakorthrowto exit a transaction block Relation#picknow uses already loaded results instead of making another query.
Improve Active Record changelog [ci skip]
activerecord/CHANGELOG.mdの修正です。
各エントリーのフォーマットの修正を行っています。
Support rolling deploys for cookie serialization/encryption changes (#37628)
actionpack/lib/action_dispatch/middleware/cookies.rbの修正です。
cookieのserialization / encryption処理で、configを変更した後の新しい値保持をしている場合、かつ、アプリケーションのconfigの指定が古い場合に、値を古いフォーマットにダウングレードして使いまわすよう修正しています。
cookies_serializerのmarshal -> hybridへの変更やuse_authenticated_cookie_encryptionを有効化した、かつ、その変更を複数サーバにデプロイしているような時に、新しい設定のサーバにアクセス後に古い設定のサーバにアクセスした際にもセッションを使いまわせるようにする為。
Deprecate committing a transaction exited with return or throw (#29333)
activerecord/lib/active_record/connection_adapters/abstract/transaction.rbの修正です。
transaction block内でreturn、break、throwを使用した場合、transactionがcommitされて終了する、という振る舞いがdeprecateになりました。次のバージョンではrollbackされるようになります。
Timeout.timeout とtransaction blockを一緒に使いたかった(指定した時間経過したらtransactionをrollbackさせたかった)が、現在はTimeout.timeoutでタイムアウトしてもtransactionがコミットされてしまう、という挙動になっていました。
これはTimeout.timeoutがthrowを使用している、かつ、transactionではraise以外でblockを終了した場合にtransactionをcommitする挙動になっている為で、上記のユースケースに対応出来るようにする為、かつ、blockがどの処理で終了したかを判別するすべが無い為、return、break、throwすべて`rollbackするよう修正しています。
Add Enumerable#pick to complement Relation#pick
activesupport/lib/active_support/core_ext/enumerable.rbの修正です。
enumerableから指定したkeyに一致する最初の値を返す、Enumerable#pickメソッドを追加しています。
[{ name: "David" }, { name: "Rafael" }, { name: "Aaron" }].pick(:name)
# => "David"
[{ id: 1, name: "David" }, { id: 2, name: "Rafael" }].pick(:id, :name)
# => [1, "David"]
Allow Relation#pick to use already loaded results
activerecord/lib/active_record/relation/calculations.rbの修正です。
既にデータをロード済みのrelationに対してpickを実行した場合に、queryを実行せずにロード済みの値を返すよう修正しています。pluckの挙動と同じ。