なるようになるブログ

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

rails commit log流し読み(2016/04/23)

2016/04/23分のコミットです。

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

activesupport/CHANGELOG.md

railties/CHANGELOG.md


fix boot performance issue

activesupport/lib/active_support/evented_file_update_checker.rbの修正です。

pathの階層チェック処理をするのに、refineを使用してPathnameメソッドを定義していたのを止めて、普通にActiveSupport::EventedFileUpdateCheckerクラス内に同じ内容のメソッドを定義するよう修正しています。

そちらの方が早い為、との事です。refinement遅いんですかねえ。


Do not attempt to return connection with open transaction to pool (#24610)

activerecord/lib/active_record/query_cache.rbの修正です。

install_executor_hooksメソッドで、transaction中じゃない場合のみ、connectionのclear処理を行うよう修正しています。

-        ActiveRecord::Base.clear_active_connections!
+        unless ActiveRecord::Base.connection.transaction_open?
+          ActiveRecord::Base.clear_active_connections!
+        end

transaction中にconnectionのclear処理を行おうとすると、デットロックになってしまう問題があった為。


https://github.com/rails/rails/commit/42dd2336b31a8d98776d039a2b9fd7f834156a78 changed INSERT INTO versions to run in 1 single query.

Active Recordの修正です。

INSERT INTO schema_migrations in 1 SQLで、schema_migrations のinsert処理で、insert 1行毎にSQLを発行していたのを、multi-row-insertを使用するよう修正したのですが、古いSQLite(3.7.10以下)ではmulti insertは使用出来ないので、SQLiteのバージョンをチェックし、3.7.10以下の場合は元の通りinsert 1行毎にSQLを発行するよう修正しています。


Fix test name

railties/test/application/configuration_test.rbの修正です。

テスト名でoverriddenoverridenにタイポしている箇所があったのを修正しています。


Schema load: Fix dupe version insert

activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rbの修正です。

assume_migrated_upto_versionメソッドで、version sqlをinsertする際に使用する変数を誤っていたのを修正しています。


Actionpack documentation typos [ci skip]

Action Packのdocの修正です。

各doc内のグラマーの修正をまとめて行っています。


Add compatibility for Ruby 2.4 to_time changes

Active Support / railtiesの修正です。

元々DateTime#to_timeTime#to_timeメソッドは、timezoneの情報を削除した値を返すようになっていたのですが、Ruby 2.4からtimezoneの情報を保持するようになりました。

これによりRailsの既存の処理が壊れてしまった(timezone情報を保持しない前提の処理になっていた為)箇所がある為、#to_timeメソッドを上書きして、timezoneの情報を保持した値を返すかどうかをRails側でハンドリングするよう修正しています。

デフォルトではtimezoneの情報を保持しないようになっていますが、ActiveSupport.to_time_preserves_timezoneにtrueを設定する事で、timezoneの情報を保持した値を返すようになります(Rails 5でrails newした場合は、デフォルトtrueになるよう設定されています)。

ENV['TZ'] = 'US/Eastern'
"2016-04-23T10:23:12.000Z".to_time
# => "2016-04-23T06:23:12.000-04:00"

ActiveSupport.to_time_preserves_timezone = true
"2016-04-23T10:23:12.000Z".to_time
# => "2016-04-23T10:23:12.000Z"

また、合わせてシステムのローカルタイムゾーンが設定されたTimeクラスのインスタンスを返す、DateTime#localtimeメソッド、及びそのaliasであるDateTime#getlocalメソッドが追加されています。

DateTime.new(2016, 3, 11, 15, 11, 12, 0).getlocal
# => 2016-03-12 00:11:12 +0900

参考:


Move DateTime#getlocal to /core_ext/date_time/calculations.rb

activesupport/lib/active_support/core_ext/date_time/calculations.rbactivesupport/lib/active_support/core_ext/date_time/compatibility.rbの修正です。

先の対応で追加されたDateTime#getlocalメソッドactive_support/core_ext/date_time/compatibility.rbからactive_support/core_ext/date_time/calculations.rbに移動しています。

DateTime#getlocalメソッドはpublic APIな為、DateTime#utcメソッド同様calculations.rbにあるのが適切だろう、という事で移動したようです。