Rails CHANGELOG "2019-11-10".."2019-11-17"
この期間の CHANGELOG.md へのコミットは4件。
ActiveRecordに関して2件、ActiveSupportに関して1件、ActionPackに関して1件。
ActiveRecord
implicit_order_column を指定しているとき、結果を確定的にするために primary_key でもソートするようにした
コミット: Additionally order by primary key if implicit_order_column is not uniq · rails/rails@31d31fc
もともとimplicit_order_column= メソッドのドキュメントには
Note that using a non-unique column can result in non-deterministic results.
「一意じゃないカラムを指定すると結果が確定的にならないから気をつけてね」と書いてある。
implicit_order_column に指定したカラムに重複している値がある場合に、環境の違いで取得するレコードの順番が変わったりする、ということ。
ああ、そういえば昔MySQLを使っていて、同じクエリでもInnoDBとMyISAMで取得順序が違っている現象に遭遇したことがあるなぁ。
他にも同じクエリに対して取得順序が変わるケースがあったりするのかな。
で、「確定的な結果が得られた方が良いよね?」ということで今回の修正。
implicit_order_column に指定したカラムが primary_key ではない場合、その指定したカラムに加えて primary_key でもソートするようになったので、確定的な結果が得られるようになった。
ConnectionAdapters::Resolver を削除して DatabaseConfigurations を優先するようにした
コミット: Remove ConnectionAdapters::Resolver in favor of DatabaseConfigurations · rails/rails@8d5a4ff
ConnectionAdapters::Resolver と DatabaseConfigurations は共通するメソッドが多い一方で微妙に一貫性がない部分もあって複雑だから共通化しようぜ?、ということ。
この結果として establish_connection メソッドに不正な引数(adapter が指定されていないHashなど)が渡された時に例外を吐くようになった。
ActiveSupport
ActiveSupport::Testing::TimeHelpers#travel_back にブロックを渡せるようになった
コミット: Accept block in travel_back time helper · rails/rails@21f907b
そもそも travel_back って何かというと、
Returns the current time back to its original state, by removing the stubs added by
travel,travel_to, andfreeze_time.
引用: ActiveSupport::Testing::TimeHelpers
「travel, travel_to, freeze_time によって追加されたスタブを削除することで、現在の時刻を元の状態に戻すよ」というもの。
今回の修正でブロック引数に対応したので、そのブロックのなかだけ時間を戻せるようになった。
ブロックの外はスタブした時間のままになる。
具体例はこんな感じ↓
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 travel_to Time.zone.local(2004, 11, 24, 01, 04, 44) Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00 travel_back do Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 end Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
引用: rails/time_helpers.rb at 21f907bb51df95a26f129277fe817019b8c37f0a · rails/rails
ActionPack
process_action.action_controller の notifications に response を丸ごと含めるようにした
コミット: Provide the whole response · rails/rails@b5c6f33
Rails CHANGELOG "2019-11-04".."2019-11-09" - tanaken’s blog で紹介した、「 process_action.action_controller の notifications に Location レスポンスヘッダを含めるようにした」に関連した修正。
response.filtered_location だけ含めるのではなく、 response を丸ごと使えば良いじゃん、となったらしい。