なるようになるブログ

読書感想文かrailsについてかrubyについてか

rails commit log流し読み(2020/03/19)

2020/03/19分のコミットです。

CHANGELOGにのったコミットは以下の通りです。

actionpack/CHANGELOG.md

activerecord/CHANGELOG.md

activesupport/CHANGELOG.md


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_serializermarshal -> 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内でreturnbreakthrowを使用した場合、transactionがcommitされて終了する、という振る舞いがdeprecateになりました。次のバージョンではrollbackされるようになります。

Timeout.timeout とtransaction blockを一緒に使いたかった(指定した時間経過したらtransactionをrollbackさせたかった)が、現在はTimeout.timeoutタイムアウトしてもtransactionがコミットされてしまう、という挙動になっていました。

これはTimeout.timeoutthrowを使用している、かつ、transactionではraise以外でblockを終了した場合にtransactionをcommitする挙動になっている為で、上記のユースケースに対応出来るようにする為、かつ、blockがどの処理で終了したかを判別するすべが無い為、returnbreakthrowすべて`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の挙動と同じ。