なるようになるブログ

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

rails commit log流し読み(2017/07/31)

2017/07/31分のコミットです。

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

activerecord/CHANGELOG.md


Merge pull request #29950 from MaxLap/avoid_or_clause_duplicates

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

orメソッドで、OR句から共通条件を抽出して、不要なOR句を削減出来るよう修正しています。

例。

class Project < ApplicationRecord
  scope :big, -> { where(big1: true).or(where(big2: true)) }
  scope :important, -> { where(important1: true).or(where(important2: true)) }
end

上記のようなscopeがあった場合、結果が下記のように変わります。

# before
Project.big.important
# => Project Load (0.2ms)  SELECT  "projects".* FROM "projects" WHERE (("projects"."big1" = ? OR "projects"."big2" = ?) AND "projects"."important1" = ? OR ("projects"."big1" = ? OR "projects"."big2" = ?) AND "projects"."important2" = ?) LIMIT ?  [["big1", 1], ["big2", 1], ["important1", 1], ["big1", 1], ["big2", 1], ["important2", 1], ["LIMIT", 11]]


# after
Project.big.important
# => Project Load (0.5ms)  SELECT  "projects".* FROM "projects" WHERE ("projects"."big1" = ? OR "projects"."big2" = ?) AND ("projects"."important1" = ? OR "projects"."important2" = ?) LIMIT ?  [["big1", 1], ["big2", 1], ["important1", 1], ["important2", 1], ["LIMIT", 11]]

rails commit log流し読み(2017/07/30)

2017/07/30分のコミットです。

CHANGELOGへの追加はありませんでした。


Fix test directory to correct path

actionview/package.jsonactionview/test/ujs/public/test/data-confirm.jsactionview/test/ujs/public/test/data-remote.jsの修正です。

eslintに指定するrails-ujsのテストディレクトリのパスに誤りがあったのを修正、及び、一部テストのコードにlint違反があったのを修正しています。


Change http postgresql.org links to https [ci skip]

www.postgresql.orgへのリンクをhttpからhttpsに修正しています。

今はhttpsが正しいURL(httpでアクセスするとhttpsにリダイレクトされる)な為。

参考:Change documentation references to PG website to use https: not http


Merge pull request #29963 from y-yagi/fix_ruby_warnings

ailties/test/application/routing_test.rbの修正です。

routingのテストでRubyのwarning(warning: method redefined; discarding old model_name)が出ていたので、model_nameをクラスメソッドとして定義し対応しています。


Fix github user output.

tasks/release_announcement_draft.erbの修正です。

release announcement用のスクリプトで、announcement内の問題があった場合にメンションするGitHubのユーザ名が正しく表示されなかったのを修正しています。


Merge pull request #29951 from georgeclaghorn/action-view-test-flow

actionview/lib/action_view/test_case.rbの修正です。

ActionView::TestCaseクラスで@view_flow変数を保持するよう修正しています。

content_forのようなcaptureメソッドでは上記変数がメソッドを使用するコンテキストに存在する必要がある為。

rails commit log流し読み(2017/07/29)

2017/07/29分のコミットです。

CHANGELOGへの追加はありませんでした。


Merge pull request #29979 from kamipo/use_build_bind_attribute

Active Recordの修正です。

Arel::Nodes::BindParamを生成する処理を独自に行っていたのを、build_bind_attributeメソッドを使用するよう修正しています。


Merge pull request #29946 from kamipo/passing_arel_to_where_is_boundable

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

UniquenessValidatorから不要になっているRelation::WhereClauseの生成処理を削除しています。


Use frozen string literal in actionpack/

Action Packの修正です。

各ファイルの先頭にfrozen_string_literal: trueを追加しています。

rails commit log流し読み(2017/07/28)

2017/07/28分のコミットです。

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

activesupport/CHANGELOG.md


Eager load the association classes on boot

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

association classes(BelongsToAssociationHasManyAssociation等)をboot時にeager loadするよう修正しています。

元々association classesはautoloadの対象になっており、参照された際に自動でloadするようになってはいたのですが、複数スレッドで同時にautoloadした際に、一つのスレッドはloadに成功するがもう一つの方はloadに失敗し、結果エラー(NameError)になってしまう、という問題があった為、boot時にeager loadするようにしたようです。

関連:Bug #12688: Thread unsafety in autoload

が、今のMRIのautoloadはスレッドセーフになっている、という指摘もあり、実際何が原因かは正確にはわかってなさそうな感じです。


[ci skip] update routing guide

rails guideのRails Routing from the Outside Inの修正です。

HTTP Verb Constraintsの項、"GET"がシングルクォートで囲まれていたのを、バッククォートで囲むよう修正しています。code blockで表示されるようにする為。


Squashed commit of the following:

rails guideのRails Routing from the Outside Inの修正です。

各項でメソッド名等をバッククォートで囲むよう修正しています。


Add missing support for modulo operations on durations

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

Durationの剰余演算で結果が正しく取得出来ないバグがあったのを修正しています。

# before

5.minutes % 120
# => 60
5.minutes % 2.minutes
# => -18000 minutesと300 seconds


# after

5.minutes % 120
# => 1 minute
5.minutes % 2.minutes
# => 1 minute

rails commit log流し読み(2017/07/27)

2017/07/27分のコミットです。

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

activesupport/CHANGELOG.md


Fix search input’s type & placeholder conflict in Routing Error page

actionpack/lib/action_dispatch/middleware/templates/routes/_table.html.erbの修正です。

Routing Error Pageの検索用inputに-webkit-appearance: textfield;を指定しています。

ブラウザがデフォルトで設定するplaceholderとhtmlで設定しているplaceholderがコンフリクトしてしまっていた為、ブラウザ側のplaceholderを表示しないようにする為設定したようです。

before

28632623-ec89dfd8-7239-11e7-8b88-e4e321fdb3e1.png (661×830)

after

28632633-f01b898a-7239-11e7-9dc6-664a7d39c896.png (660×831)


Use _relation_for_itself wherever possible

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

自身のrelationを取得する処理を独自に行っていたのを、_relation_for_itselfメソッドを使用するよう修正しています。_relation_for_itselfメソッドはその為のメソッドの為。


Merge pull request #28695 from koic/integer_type_has_precision_option_in_oracle

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

schema dumpにcommentが含まれる事を確認するテストがOracle adapterでコケてしまっていたのを修正しています。

+      if current_adapter?(:OracleAdapter)
+        assert_match %r[t\.integer\s+"rating",\s+precision: 38,\s+comment: "I am running out of imagination"], output
+      else
+        assert_match %r[t\.integer\s+"rating",\s+comment: "I am running out of imagination"], output
+      end

Oracle adapterの場合、precisionの指定が無くてもdumpにprecisionが出力されてしまうからのようです。


Fix division where a duration is the denominator

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

Fix implicit calculations with scalars and durationsの影響で、分母にDurationを使用した除算の結果がおかしくなってしまっていたのを修正しています。

# before
86400 / 1.hour
# => 86400 hours

1.day / 1.hour
# => 0 days


# after
86400 / 1.hour
# => 24

1.day / 1.hour
# => 24

5.1.1までと同じように、Integerの結果がかえるようになっています。

rails commit log流し読み(2017/07/26)

2017/07/26分のコミットです。

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

activerecord/CHANGELOG.md


Require alpha arel

activerecord/activerecord.gemspecの修正です。

Arelのバージョンを9.0.0.alphaに更新しています。

-  s.add_dependency "arel", "~> 8.0"
+  s.add_dependency "arel", "9.0.0.alpha"

~> だとalphaバージョンをインストールしてくれない為、のようです。


Update Gemfile.lock to reflect arel 9.0.0.alpha

Gemfile.lockの修正です。

先のgemspecの修正でGemfile.lockの更新が漏れていたのを対応しています。


Remove single element array preprocess

activerecord/lib/active_record/associations/preloader/association.rbactiverecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rbの修正です。

Refactor Active Record to let Arel manage bind paramsの対応により不要になった、idsの要素が一つだった場合の前処理を削除しています。


Allow Relation#or to accept a relation with different references

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

referencesの値だけが異なるrelationに対して、Relation#orメソッドが正常に動作するよう修正しています。

joined = User.joins(:posts).references(:posts)
joined.where(posts: { name: 'example' }).or(joined.where(name: 'example'))

上記のようなケース。


Clarify add_column limit documentation

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

add_columnメソッドのlimitオプションについて説明している箇所に、幾つかのDBではこのオプションは無視される旨注記を追加しています。具体的にはPostgreSQLでは無視されます。


Allow bin/rails test task to take absolute paths as arguments

railties/lib/rails/test_unit/runner.rbの修正です。

test runnerにテストを行うファイルを絶対パスで渡した場合に正常に動作しないバグがあったのを修正しています。


Require arel master in the benchmark template

guides/bug_report_templates/benchmark.rbの修正です。

使用するgemにarelを追加しています。今のRailsのmasterブランチを動作させるにはarelのmasterを参照する必要がある為。


Use exact Rails version when verifying.

tasks/release.rbの修正です。

release後のverify taskで、直前にreleaseしたバージョンのRailsでアプリを作成するよう修正しています。

rails commit log流し読み(2017/07/25)

2017/07/25分のコミットです。

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

activerecord/CHANGELOG.md


Fix test failures when prepared statements are disabled

Active Recordの修正です。

先日行われたActive Recordのリファクタリング(Refactor Active Record to let Arel manage bind params)の影響で、prepared statementsをdiableにした場合にテストがコケていたのを修正しています。

partial queryを管理するためのcolletor classを作ったりして、まだちょっとリファクタリングを行っています。


Include rack-mini-profiler by default

railties/lib/rails/generators/rails/app/templates/Gemfileの修正です。

デフォルトで生成されるGemfileMiniProfiler/rack-mini-profilerを追加しています。

が、まだ議論がされきってないのと、rack-mini-profilerはモンキーパッチだらけで良くないのではという事で、後ほどrevertされています。


Revert “Include rack-mini-profiler by default”

というわけで、直前のrack-mini-profilerをデフォルトのgemに追加した対応をrevertしています。


Merge pull request #29765 from lugray/fix_counter_cache

activerecord/lib/active_record/associations/builder/belongs_to.rbactiverecord/lib/active_record/counter_cache.rbの修正です。

after_create callbackの中でupdate_attributesを使用した、かつ、複数のbelongs_to assocationがあり、それぞれcounter cachesを使用している場合に、更新処理でcounter cachecが一度しかインクリメントされない事を確認するテストを追加しています。

元々は、上記条件の場合に2回インクリメントがされてしまっていたのですが、そちらのバグは違うコミットで直ってしまっていたので、このコミットではリグレッションテストだけを追加しています。


Merge pull request #29792 from lugray/delegate_respond_to

actionview/lib/action_view/helpers/controller_helper.rbの修正です。

ActionView::Helpers::ControllerHelper moduleにrespond_to?メソッドを定義し、ControllerHelperがcontrollerにdelegateするメソッド(request_forgery_protection_tokenparams等)については、controllerに対してrespond_to?を行うよう修正しています。


Merge pull request #29853 from lugray/move_generator_namespacing_to_base

railties/lib/rails/generators/base.rbrailties/lib/rails/generators/named_base.rbの修正です。

NamedBaseクラスに定義されていたnamespaceに関するメソッドを、Baseクラスに移動しています。namespaceを正しく扱えてないgeneratorでnamesapceを扱えるようにする為、との事です。んー、メソッド移動せず、NamedBaseクラスを使用するよう修正する、で良さそうな気もしたのですが…。


Merge pull request #29902 from y-yagi/fix_29880

railties/lib/rails/commands/server/server_command.rbの修正です。

Pumaを使用している際、rails serverの起動メッセージにURLの情報(e.g. Rails 5.1.2 application starting in development on http://localhost:3000on http://localhost:3000の部分)を出力しないよう修正しています。

PumaはPuma自体で独自のconfigを持てる、かつ、そこでhostやportの情報が定義出来てしまい、rails serverでは実際に起動する際にしようするhostやportの情報を正しく知る事が出来ない為。


Fix warning: assigned but unused variable - comment

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

test_multiple_counter_cache_with_after_create_updateから、使用していない変数を削除しています。


Merge pull request #29848 from kamipo/fix_distinct_count_with_order_and_limit

Active Recordの修正です。

Avoid unscope(:order) when limit_value is presented for countで、limit_valueが指定されている場合はunscope(:order)`を行わないよう修正したのですが、その影響でDISTINCT + COUNT + ORDER BY + LIMITを実行した場合に、不正なSQLが生成されてしまいエラーになってしまうバグがあったのを修正しています。

# before
User.distinct.order(updated_at: :desc).limit(10).count
# SELECT COUNT(DISTINCT count_column) FROM (SELECT  DISTINCT "users"."id" AS count_column FROM "users" ORDER BY "users"."updated_at" DESC LIMIT $1) subquery_for_count  [["LIMIT", 10]]
# ActiveRecord::StatementInvalid: PG::InvalidColumnReference: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
LINE 1: ...users"."id" AS count_column FROM "users" ORDER BY "users"."u...
# : SELECT COUNT(DISTINCT count_column) FROM (SELECT  DISTINCT "users"."id" AS count_column FROM "users" ORDER BY "users"."updated_at" DESC LIMIT $1) subquery_for_count


# after
User.distinct.order(updated_at: :desc).limit(10).count
# SELECT COUNT(*) FROM (SELECT  DISTINCT "users".* FROM "users" ORDER BY "users"."updated_at" DESC LIMIT $1) subquery_for_count  [["LIMIT", 10]]

Merge pull request #29897 from kirs/frozen-actionview

Action Viewの修正です。

各ファイルの先頭にfrozen_string_literal: trueを追加しています。


Suppress warning from actionview controller helper.

actionview/lib/action_view/helpers/controller_helper.rbの修正です。

ActionView::Helpers::ControllerHelper moduleでRubyのwarning(`*' interpreted as argument prefix)が出ていたのをで、中括弧を追加し対応しています。


Merge pull request #29859 from dwightwatson/feature/rack-test

actionpack/actionpack.gemspecの修正です。

rack-testのが0.6系を使用するよう固定されていたのを、バージョンの上限ロックを行わないよう修正しています。

-  s.add_dependency "rack-test", "~> 0.6.3"
+  s.add_dependency "rack-test", ">= 0.6.3"

remove depreciated assertion to eliminate warning

activesupport/test/hash_with_indifferent_access_test.rbの修正です。

assert_equalメソッドのexpected引数にnilを指定していたテストを、assert_nilを使用するよう修正しています。

Minitest 5.10から上記使い方がdeprecateになり、nilを期待する場合はassert_nilが使用する必要がある為。


Merge pull request #29898 from deivid-rodriguez/follow_up_to_multiple_location_engine_mounting

actionpack/lib/action_dispatch/routing/mapper.rbactionpack/lib/action_dispatch/routing/routes_proxy.rbの修正です。

一つのRails Engineを異なるlocationにmount出来るよう修正した、Allow mounting the same engine several times in different locations.の影響で、engineの route helpersを使用した際に正しいpathが取得出来ないバグが出来てしまっていたのを修正しています。


Merge pull request #29866 from rlue/master

actionpack/lib/action_controller/metal/strong_parameters.rbのdocの修正です。

ActionController::Parameters#deleteメソッドのdocで、引数に指定されたkeyが存在しなかった場合の挙動の説明が実際の挙動と異なっていた(説明には、keyが存在しなかったからdefault valueを返すと書かれていたのが、実際返ってくるのはnil)のを修正しています。


Fix warning: ambiguous first argument

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

db:schema:loadのテストでRubyのwarning(warning: ambiguous first argument; put parentheses or a space even after)が出ていたので、中括弧を追加し対応しています。


Merge pull request #29919 from kirs/actionpack-frozen-friendly

Action Packの修正です。

ファイルの先頭にfrozen_string_literal: trueを追加、及び、Stringを変更する箇所でdupを呼び出す等行い、エラーにならないよう対応しています。


Stop creating ApplicationRecord on model generation

Active Record、railtiesの修正です。

application_record.rbが存在しない場合に、model generatorが自動でapplication_record.rbを生成するようにしていたのを、生成しないよう修正しています。

元々Rails 5.0でapplication_record.rbが導入された際に、移行用に自動で生成するようになっていたのですが、もう移行は不要だろうという事で生成しないようになっています。

代わりに、application_record.rbを生成する為のgeneratorが追加されたので、今後application_record.rbが必要になった場合は、そちらを使用する事で対応可能です。


Fix test_add_column_with_timestamp_type when using Oracle

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

test_add_column_with_timestamp_typeのテストがOracle adapterでエラーになっていたのを修正しています。


Extract assert_output and available_pty? into ConsoleHelpers module

railtiesのテストの修正です。

各テストクラスで独自に定義していたconsole test用のヘルパーメソッドをmodule(ConsoleHelpers)に切り出しています。


Suppress deprecated warning in Action Cable

Gemfile.lockの修正です。

event_emitter gemのバージョンを0.2.6に更新しています。0.2.6でFixnumに関する対応を行われており、deprecateメッセージが出ないようになっている為。

参考:Fix Fixnum warning on Ruby 2.4+


[ci skip] Add documentation for after_create_commit and after_update_commit callbacks

rails guideのActive Record Callbacksの修正です。

Transaction Callbacksの項に、after_create_commitafter_update_commitを同じmodelに同時に定義した場合、後勝ち(後で定義した方のみ実行される)になってしまう事についての説明を追加しています。


Remove useless JoinInformation

Active Recordの修正です。

Refactor Active Record to let Arel manage bind paramsの対応により不要になったJoinInformation Structを削除しています。


Remove unused queries_predicates

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

Refactor Active Record to let Arel manage bind paramsの対応により不要になったqueries_predicatesメソッドを削除しています。


Fix dbconsole test when tempdir is a long path

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

dbconsoleのテストで、DB名を取得するのに.databasesを使用していたのを、pragma database_list;を使用するよう修正しています。

.databasesだとpathが長い場合に適当なサイズに結果がトランケートされてしまい、正しく値が取得されない事がありました。しかしpragma database_listだと結果がトランケートされない為、そちらを使用するようにしたとの事です。


Fix failing tests

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

Arelにdelegateするメソッドの一覧からbind_valuesを削除しています。

bind_valuesもう使わなくなった為。参考:Remove unused bind_values