なるようになるブログ

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

rails commit log流し読み(2015/09/23)

2015/09/23分のコミットです。

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

activerecord/CHANGELOG.md


tests, use if_exists: true instead of rescue nil.

activerecord/test/cases/migration/helper.rbの修正です。

teardownでテスト用のtableをdropする際、if_existsオプションで存在チェックを行うよう修正しています。


Remove unneeded generator variable.

railties/test/generators/shared_generator_tests.rbの修正です。

test_template_is_executed_when_supplied_an_https_pathメソッドから使用していない変数を削除してみあす。


Update i18n.md [ci skip]

rails guideのRails Internationalization (I18n) APIの修正です。

application.rbconfig/application.rbに修正しています。


introduce conn.data_source_exists? and conn.data_sources.

Active Recordの修正です。

connection.data_sourcesメソッドconnection.data_source_exists?メソッドを新規に追加しています。

data_sourcesメソッドはtablesとviewsを返すメソッドで、data_source_exists?該当のtable or viewが存在するかどうかをチェックするためのメソッドです。

元々、`SchemaCache#tables, SchemaCache#table_exists?というメソッドがあったのですが、これらのメソッドがDBのadapterにより返す値が異なる(PostgreSQL adapterはtableのみを返すが、MySQL adapterはtable + viewを返す) という問題があった為、メソッドを整理する為に、tables と viewsをまとめて返す為のdata_sourcesメソッドを追加しています。

これに伴い、SchemaCache#tables, SchemaCache#table_exists?, SchemaCache#clear_table_cache!はdeprecateになります。また、tablesメソッドは、tableのみ返すよう対応される予定です(All AR::ConnectionAdapters#tables return only tables(exclude views))。


Merge pull request #21722 from ronakjangir47/test_delivery_methods

actionmailer/test/delivery_methods_test.rbの修正です。

deliverメソッドのテストで、 エラーがraiseされる事しか確認していなかったのを、エラーメッセージも確認するよう修正しています。


don't deal with nil values

actionpack/lib/action_controller/metal/params_wrapper.rbactionpack/lib/action_dispatch/http/mime_negotiation.rbの修正です。

ParamsWrapper moduleの_wrapper_enabled?メソッドでrequestオブジェクトのcontent_mime_typeを取得する際、nilの場合を考慮してtryメソッドを使用していたのですが、 content typeが設定されていない場合は、early returnするようにし、取得処理ではnilを考慮しないで済むよう修正しています。


ask the request object for the session

actionpack/lib/action_dispatch/middleware/flash.rbの修正です。

Flash#callメソッドでsession情報を取得する際、Request::Session.findメソッド経由ではなく、作成済みのrequestオブジェクト経由で値を取得するよう修正しています。


Fix arguments of AR::Calculations#sum

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

Calculations#sumメソッドの引数が*argsになっていたのを、必要な引数を明確に定義するように修正、及び、 メソッド内でEnumerable#sumを呼び出す際、引数を全て渡すのではなく、必要なブロック引数のみ渡すよう修正しています。


stop using deprecated method in mailers controller

railties/lib/rails/mailers_controller.rbrailties/lib/rails/templates/rails/mailers/email.html.erbの修正です。

先日deprecateになったmime typeを定数から取得する処理を使用している箇所があったのを、Mime::Type経由で値を取得するよう修正しています。


Add tests for sanitize named bind arity

activerecord/test/cases/finder_test.rbの修正です。

キー名を指定したplaceholderを使用した場合のテストを追加しています。

assert_nothing_raised                                { bind "name = :name", { name: "37signals" } }
assert_nothing_raised                                { bind "name = :name", { name: "37signals", id: 1 } }
assert_raise(ActiveRecord::PreparedStatementInvalid) { bind "name = :name", { id: 1 } }

Remove not used argument table_name of sanitize_sql_for_conditions

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

sanitize_sql_for_conditionsメソッドから、使用していないtable_name変数を削除しています。


Remove leading slash from path

rails guideのGetting Started with Enginesの修正です。

Mounting the Engineの項、GemfileにRails Engineで作ったgemを指定するexampleで、pathオプションの指定を絶対パスから相対パスに修正しています。

-gem 'blorgh', path: "/path/to/blorgh"
+gem 'blorgh', path: "path/to/blorgh"

んー、これは絶対パスで良さそうな気もするんですけどねえ。


remove warning from Calculations#sum

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

Calculations#sumメソッドで、warning:&' interpreted as argument prefix`のワーニングが出力されていたのを対応しています。

-      return super &block if block_given?
+      return super(&block) if block_given?

&の付く変数を括弧で囲まないと出てしまうワーニングですね。


Updated Mime Negotiations docs [ci skip]

actionpack/lib/action_controller/metal/http_authentication.rbactionpack/lib/action_dispatch/http/mime_negotiation.rbのdocの修正です。

各docで、先日deprecateになったmime typeを定数から取得する処理を使用している箇所があったのを、Mime::Type経由で値を取得するよう修正しています。


Fixed taking precision into count when assigning a value to timestamp attribute

Active Record / Active Modelの修正です。

timestamp型のカラムをDBからロードした時と、データを作成した時とでusecの値が異なる問題があったのを修正しています。

d1 = Developer.create!(name: 'bogdan')
d2 = Developer.find(d1.id)
d1.created_at.usec # => 837728
d2.created_at.usec # => 0

d1.created_at == d2.created_at  # => false
d1.cache_key == d2.cache_key    # => false

precisionの設定により、RubyのtimestampよりDBで保持するprecisionの精度が低い場合に問題が起きてしまっていたようです。 データをロードした時、timestamp型の値をStringで扱っていたのをtime objectとして扱うよう修正して対応しています。