なるようになるブログ

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

rails commit log流し読み(2019/03/22)

2019/03/22分のコミットです。

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

activerecord/CHANGELOG.md


Prefer render template: in tests

Action Viewの出力です。

templateのrenderをしたいだけのテストでfileオプションを使用していたのを、templateオプションを使用するよう修正しています。templateをrenderしたい場合、templateオプションの方が適切な為。


Fix server restart test on Puma 3.12.1

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

rails serverのrestartのテストがPuma 3.12.1で失敗していたのを修正しています。

Puma 3.12.1でデフォルトのhostを正しく扱えるようになったのですが、その影響でrestart時に表示されるログの内容が変わってしまった為。

参考:Rack handler should use provided default host


Fix release template

tasks/release_announcement_draft.erbの修正です。

release announceに適切に改行が含まれるよう修正しています。


Fix announce script

tasks/release_announcement_draft.erbの修正です。

引き続きrelease announceに適切に改行が含まれるよう修正しています。


Merge pull request #35617 from mattyoho/add-annotation-support-to-relations

Active Recordの修正です。

queryにSQLコメントを追加する為の、ActiveRecord::Relation#annotateメソッドを追加しています。

Post.where(id: 123).annotate("this is a comment").to_sql
# SELECT "posts".* FROM "posts" WHERE "posts"."id" = 123 /* this is a comment */

引数にはArrayを指定する事が出来、Arrayを指定した場合はそれぞれ別のコメントとして出力されます。

User.annotate("selecting", "user", "names").select(:name)
# SELECT "users"."name" FROM "users" /* selecting */ /* user */ /* names */ LIMIT ?  [["LIMIT", 11]]

rails commit log流し読み(2019/03/21)

2019/03/21分のコミットです。

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


Merge pull request #35661 from jhawthorn/lookup_context_validation

actionview/lib/action_view/lookup_context.rbactionview/lib/action_view/rendering.rbの修正です。

LookupContext#formats=の引数に不正なformat(ActionView::Template::Types.symbolsに登録されてない値)を指定した場合に、ArgumentErrorをraiseするよう修正しています。


Merge pull request #35546 from rails/bulk-inserts-with-index

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

bulk insert処理でindexを指定するのにunique_byオプションにcolumnsまたはwhereをオプションで指定する必要があった(e.g. unique_by: { columns: %w[ isbn ], where: "published_on IS NOT NULL" })のを、unique_byに直接カラム名、又は、インデックス名を指定する形に(e.g. unique_by: %i[ author_id name ]unique_by: :index_books_on_isbn)修正しています。


Document option forwarding in ActiveRecord::Base.attribute

activerecord/lib/active_record/attributes.rbactiverecord/test/cases/attributes_test.rbの修正です。

ActiveRecord::Base.attributeのdocに、attributeに指定された追加のオプションはそのままtype objectのconstructorに渡せれる旨説明を追加、及び、その挙動を確認するテストを追加しています。


Address rubocop offences

actionpack/test/controller/new_base/content_negotiation_test.rbactiverecord/lib/arel/nodes/select_core.rbの修正です。

rubocopの設定に違反している箇所があったのをまとめて修正しています。


Fix document formatting of Database configuration classes [ci skip]

Active Recordのdocの修正です。

Database configuration関連クラスのdocのフォーマットを修正しています。

rails commit log流し読み(2019/03/20)

2019/03/20分のコミットです。

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


Update regular expression for checking valid MIME type

actionpack/lib/action_dispatch/http/mime_type.rbの修正です。

Raise exception when building invalid mime typeで行われたmime typeのチェック処理で、パラメータが指定されていた場合の考慮(e.g. text/html; parameter")が不足していたのを修正しています。


Instrument middleware processing

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

middleware生成時に使用する為のinstrument event(process_middleware.action_dispatch)を追加しています。payloadにはmiddlewareのクラス名が含まれるようになっています。


Merge pull request #35660 from kamipo/sanitize_as_sql_comment

Active Recordの修正です。

sanitize_as_sql_commentメソッドをSQL visitorからconnectionに移動しています。他の箇所でも使用出来るようにする為。


Merge pull request #35662 from jhawthorn/fallback_resolver_no_virtual_path

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

FallbackFileSystemResolverインスタンス生成時にvirtual_pathを渡さないよう修正しています。

以前はdecorateメソッドでvirtual_pathが削除されるようになっていたのですが、Don't mutate virtual_path, remove decoratedecorateメソッドが削除された影響でvirtual_pathが渡されるようになっていました。

これにより、rails-controller-testing gemの挙動に影響を与えてしまった為、元の挙動を維持するよう修正しています。

参考:Allow assert_template(file:) to work using Rails 6


Merge pull request #35664 from jeremyevans/remove-roflscaling

Active Recordの修正です。

GROUP BYWHERE等のSQLクエリー使用時に使用する文字列を定数で保持していたのを、定数を使用しないよう修正しています。

元々不要なオブジェクトが生成されるのを避けるために定数を使用していたのですが、frozen string literalsが使用される事になった事で、定数で保持するメリットが無くなった為。


Merge pull request #35656 from larouxn/revert-34277-remove-javascripts-javascripts_engine-options-for-generators

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

javascripts、及び、javascript_engineオプションを削除した、Remove javascripts and javascript_engine options for generatorsをRevertしています。

coffee-railsを引き続き使用するような場合に、これらのオプションが無いとgeneratorで正しくファイルの生成が出来ないため。

が、修正する箇所に誤りがあり、後ほどRevertされています。


Re-add Template#updated_at as deprecated

actionview/lib/action_view/file_template.rbactionview/lib/action_view/template.rbの修正です。

Make Template::Resolver always cacheで削除されたActionView::Template#updated_atを、再度指定出来るよう修正しています。

openになっているattributeだった為、いきなり削除ではなく、まずはdeprecateメッセージを表示するようにしています。


Fix test broken by 04ae0b0b5e594e0bb99c5cd608921745977bcdcd

actionpack/test/controller/show_exceptions_test.rbの修正です。

Instrument middleware processingの対応の影響で、ActionDispatch::ShowExceptionsのテストがエラーになってしまっていたのを修正しています。


Revert "Revert "Remove javascripts and javascript_engine options for generators""

javascripts、及び、javascript_engineオプションを削除した、Remove javascripts and javascript_engine options for generatorsをRevertした、Merge pull request #35656 from larouxn/revert-34277-remove-javascripts-javascripts_engine-options-for-generatorsをRevetしています。

修正する箇所に誤りがあった為。


Merge pull request #35595 from shioyama/generated_attribute_methods_namespaced_constant

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

GeneratedAttributeMethods moduleをmodelのnamespace配下で生成するよう修正しています。

# Before
User.send(:generated_attribute_methods)
# => #<ActiveRecord::AttributeMethods::GeneratedAttributeMethods:0x000056275f3c2aa8>


# After
User.send(:generated_attribute_methods)
# => User::GeneratedAttributeMethods

GeneratedAssociationMethodsはmodelのnamespace配下で生成するようになっており、挙動を合わせる為。


Merge pull request #35649 from andrehjr/fix-override-of-cookies-controller-specs

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

CookieJar#update_cookies_from_jarで既に設定済みのkeyについては上書きしないよう修正しています。


Add mention about process_middleware.action_dispatch in the guide [ci skip]

rails guideのActive Support Instrumentationの修正です。

Instrument middleware processingで追加されたprocess_middleware.action_dispatch eventについてguiden説明を追加しています。


Make aliases of database option in generators work

Refactor migrations_path command option to databaseで追加されたgeneratorのdatabaseオプションの、aliasであるdbオプションが指定しても動作しないバグがあったのを修正しています。

rails commit log流し読み(2019/03/19)

2019/03/19分のコミットです。

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

activesupport/CHANGELOG.md


Added release notes for changes in Railties [ci skip] (#35622)

rails guideのRuby on Rails 6.0 Release Notesの修正です。

railtiesの変更点についてRelease Notesに記載しています。


Don't expose internal type_casted_binds method

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

内部でだけで使用するtype_casted_bindsメソッドの可視性をprivateに変更しています。


Extract column check in values_list

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

values_listメソッドで行っていたcolumのチェック処理を別メソッド(verify_columns_exist_for)に切り出しています。


Simplify values_list with more composition

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

他のvalues_listメソッドで行っていた処理も適切にメソッドに切り出すよう修正しています。


Merge pull request #35663 from eileencodes/fix-database-configuration-when-not-actually-a-three-tier

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

development:
  primary:
    database: "my db"
    variables:
      statement_timeout: 1000

のように、database.ymlに3階層より下の階層があった場合に、configロード時にエラーになってしまうバグがあったのを修正しています。


Fix a ContentNegotiation test description

actionpack/test/controller/new_base/content_negotiation_test.rbの修正です。

accept headerにtext/javascript及び*/*を指定 + XHRの場合のテストの、テスト名に誤りがあった(実際の結果と異なる内容を記載していた)のを修正しています。


Merge pull request #35659 from rails/fix-time-advance-with-historical-dates

activesupport/lib/active_support/core_ext/time/calculations.rbの修正です。

Time#advanceメソッドが1001-03-07より前の日付だと正しい値を返さないバグがあったのを修正しています。

# Before
Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-05 00:00:00 UTC

# After
Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-06 00:00:00 UTC

depend on Zeitwerk 1.4.0

activesupport/activesupport.gemspecactivesupport/lib/active_support/dependencies/zeitwerk_integration.rbの修正です。

Zeitwerkのバージョンを~> 1.4に修正、及び、Zeitwerk側の変更に合わせて、constantsのautoload処理の修正を行っています。


Merge pull request #35620 from RTJ/master

rails/activestorage/db/update_migrate/20180723000244_add_foreign_key_constraint_to_active_storage_attachments_for_blob_id.rbの修正です。

active_storage_attachments tableからactive_storage_blobsに外部キー制約を貼る為のmigrationファイルで、Active Storageに関するテーブルがそもそも存在するかチェックするようにして、存在しない場合は処理を行わないよう修正しています。


Merge pull request #35604 from jhawthorn/validate_mime_types

actionpack/lib/action_dispatch/http/mime_type.rbactionpack/lib/action_dispatch/testing/request_encoder.rbの修正です。

mime type構築時に、不正な値(e.g. スラッシュが無い(missingslash)、スラッシュが多すぎる(too/many/slash)、空の値)の場合、exceptionをraiseするよう修正しています。


update_at/on note for ActiveRecord::Relation.update_all (#35461)

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

update_allメソッドのdocに、callbackが実行されないので、update_at / update_on等のタイムスタンプのカラムは更新されない旨注記を追加しています。


Merge pull request #35358 from tjwallace/patch-1

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

resourcesメソッドのdocにparamオプションについての説明を追加しています。

rails commit log流し読み(2019/03/18)

2019/03/18分のコミットです。

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


Tweak truncate_tables

activerecord/lib/active_record/connection_adapters/abstract/database_statements.rbactiverecord/lib/active_record/tasks/database_tasks.rbの修正です。

不要なemptyチェックの削除、early returnを使用するよう修正等の対応を行っています。


Add test case for unscoping :optimizer_hints

Active Recordの修正です。

optimizer_hintsをunscopeした場合のテストを追加しています。


Add :reselect and :optimizer_hints to the list of finder methods

rails guideのActive Record Query Interfaceの修正です。

Retrieving Objects from the Databaseの項にあるfinder methodsの一覧に:reselect:optimizer_hintsを追加しています。


Ruby 2.4 and later support native Unicode case mappings

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

Tags::Base#sanitized_valueメソッドで値をsanitizeするのにmb_chars + downcaseを使用していたのを、downcaseだけ使用するよう修正しています。

Ruby 2.4以降だとRuby側でUnicodeのcase mappingsをしてくれるようになっている為。


Get rid of Arel::Nodes::Values

Active Recordの修正です。

Arel::Nodes::Values classを削除しています。Arel::Nodes::ValuesListが同等の機能を提供しており、そちらを使用すれば良いため。


Suggest 'strict-origin' Referrer-Policy header

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

valid_request_origin?メソッドで、InvalidAuthenticityTokenをraiseした際に表示するエラーメッセージ内のポリシー名をタイポしていた(strict-same-origin -> strict-origin)のを修正しています。


Fix updating rich text via nested attributes

actiontext/lib/action_text/attribute.rbの修正です。

rich textがnested attributes経由で更新出来ないバグがあったのを修正しています。


Add test case to prevent possible SQL injection

Active Recordの修正です。

optimizer_hintsメソッドでSQLのsanitaize処理が行われる事を確認するテストを追加しています。


Merge pull request #35652 from razh/revert-rails-ujs-html-content

rails-ujsでHTML responseをplain-textとして扱うよう修正した、Pass HTML responses as plain-text in rails-ujsをrevertしています。

jquery-ujsの挙動と合わせる為この対応を行ったのですが、これはこれでbreaking changeになってしまう(dataインスタンスが変わってしまう)為、既存の振る舞いを維持する為revertしています。

rails commit log流し読み(2019/03/17)

2019/03/17分のコミットです。

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

railties/CHANGELOG.md


Merge pull request #35642 from simi/raise-on-unknown-column-during-insert-all

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

insert_all等のbulk insert系のメソッドで、引数に存在しないカラムが指定された場合に、UnknownAttributeErrorをraiseするよう修正しています。


ActiveRecord::Result#to_hash has been renamed to to_a [ci skip]

rails guideのActive Record Query Interfaceの修正です。

ActiveRecord::Result#to_hashを使っている箇所を、ActiveRecord::Result#to_aを使用するよう修正しています。

Deprecate ActiveRecord::Result#to_hash in favor of #to_ato_hashはdeprecateになった為。


Extract truncate and truncate_tables into database statements

Active Recordの修正です。

DatabaseTasksで定義していたtruncate、及び、truncate_tablesメソッドをdatabase statementsで定義するよう修正しています。


Fix warning: instance variable @optimizer_hints not initialized

activerecord/lib/arel/nodes/select_core.rbの修正です。

instance variable @optimizer_hints not initializedのwarningが出ていたのを修正しています。


Merge pull request #35637 from y-yagi/add_environment_option_to_initializers

railties/lib/rails/commands/initializers/initializers_command.rbの修正です。

rails initializersコマンドでenvironmentをオプション(-e/--environment)で指定出来るよう修正しています。


Make truncate_tables to bulk statements

Active Recordの修正です。

truncate_tablesメソッドで複数のtableに対してtruncate文を実行するのにbulk statementsを使用するよう修正しています。


Ensure execute_batch discards remaining results

activerecord/lib/active_record/connection_adapters/abstract/database_statements.rbactiverecord/lib/active_record/connection_adapters/mysql/database_statements.rbの修正です。

MySQLexecute_batchメソッドで処理実行後にabandon_results!メソッドを呼び出して結果を必ず破棄するよう修正しています。


Fix undefined local variable or method `discard_remaining_results'

activerecord/lib/active_record/connection_adapters/mysql/database_statements.rbの修正です。

先の対応で削除したメソッドdiscard_remaining_resultsを使用している箇所があったのを、abandon_results!を使用するよう修正しています。


SQLite3: Make fixture loading to bulk statements

Active Recordの修正です。

SQLite3でfixuteをloadする際にbulk statementsを使用するよう修正しています。

rails commit log流し読み(2019/03/16)

2019/03/16分のコミットです。

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

activesupport/CHANGELOG.md

activerecord/CHANGELOG.md


Rename ActionView::Base#run to #_run

Action Viewの修正です。

ActionView::Base#runActionView::Base#_runにリネームしています。アプリ側でviewにrunという名前のメソッドを定義しているケースがあるらしく、メソッド名が被ってしまうのを避ける為、_ prefixを指定するようにしています。


Merge pull request #35623 from jhawthorn/actionview_cache

Action Viewの修正です。

Template::Resolverでファイルの更新日時元にキャッシュ可能かどうかチェックし、更新されていた場合のみキャッシュするようにしていたのを、更新日時に関わらず必ずキャッシュするよう修正しています。

現状、dev環境ではリクエスト毎にキャッシュはクリアされるようになっており、更新日時によるチェックは意味が無いため。

dev環境で、更新されたファイルのキャッシュのみ削除する対応については、[WIP] Only clear ActionView caches in dev when files changeで対応中との事です。


Merge pull request #35628 from jhawthorn/file_update_any_extension

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

FileUpdateCheckerディレクトリ + 空の拡張子を渡した際に、全ての拡張子のファイルをチェック対象にするよう修正しています。


Engines are reloaded in Zeitwerk mode [closes #35618]

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

enginesのコードをmain autoloaderで管理するよう修正してます。

元々はonce autoloaderで管理されており、一度しかloadされないようになっていました。が、engineはアプリ側の定数を参照している事があり、アプリ側のコードが変更&アプリ側のコードがreloadされた際に、engineもreloadしないと更新された値が正しく参照出来ない為、reloadされるようmain autoloaderで管理するように修正しています。


Merge pull request #35634 from sharang-d/update-parameterize-docs

activesupport/lib/active_support/core_ext/string/inflections.rbactivesupport/lib/active_support/inflector/transliterate.rbのdocの修正です。

ActiveSupport::Inflector.parameterizeメソッドのdocにlocaleオプションについての説明を追加、及び、各箇所のフォーマットの修正を行っています。


Support Optimizer Hints

Active Recordの修正です。

Optimizer Hints用のメソッドを追加しています。

# MySQL
Topic.optimizer_hints("MAX_EXECUTION_TIME(50000)", "NO_INDEX_MERGE(topics)")
# SELECT /*+ MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(topics) */ `topics`.* FROM `topics`

# PostgreSQL(pg_hint_plan)
Topic.optimizer_hints("SeqScan(topics)", "Parallel(topics 8)")
# SELECT /*+ SeqScan(topics) Parallel(topics 8) */ "topics".* FROM "topics"

MySQLは本体でサポートされていますが、PostgreSQLの場合は別途pg_hint_plan moduleのインストールが必要です。