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.

引用: ActiveRecord::ModelSchema

「一意じゃないカラムを指定すると結果が確定的にならないから気をつけてね」と書いてある。

implicit_order_column に指定したカラムに重複している値がある場合に、環境の違いで取得するレコードの順番が変わったりする、ということ。

ああ、そういえば昔MySQLを使っていて、同じクエリでもInnoDBMyISAMで取得順序が違っている現象に遭遇したことがあるなぁ。

他にも同じクエリに対して取得順序が変わるケースがあったりするのかな。

で、「確定的な結果が得られた方が良いよね?」ということで今回の修正。

implicit_order_column に指定したカラムが primary_key ではない場合、その指定したカラムに加えて primary_key でもソートするようになったので、確定的な結果が得られるようになった。

ConnectionAdapters::Resolver を削除して DatabaseConfigurations を優先するようにした

コミット: Remove ConnectionAdapters::Resolver in favor of DatabaseConfigurations · rails/rails@8d5a4ff

ConnectionAdapters::ResolverDatabaseConfigurations は共通するメソッドが多い一方で微妙に一貫性がない部分もあって複雑だから共通化しようぜ?、ということ。

この結果として 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, and freeze_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 を丸ごと使えば良いじゃん、となったらしい。