なるようになるブログ

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

rails commit log流し読み(2015/10/21)

2015/10/21分のコミットです。

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

activerecord/CHANGELOG.md

activesupport/CHANGELOG.md

actionpack/CHANGELOG.md

actionview/CHANGELOG.md


Merge pull request #21858 from Gaurav2728/protected_method_nodoc

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

Rails内部だけで使うメソッドに、:nodoc:を指定しています。


Merge branch 'fix-21955'

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

has_many association + rewhereを使用した場合に、rewhereが正しく設定されないバグがあったのを修正しています。

issueより抜粋。

class Post < ActiveRecord::Base
  has_many :comments, -> { rewhere(post_id: 99) }
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

post = Post.create!

# rails 4.2.3
post.comments.to_sql  #=> 'SELECT "comments".* FROM "comments" WHERE "comments"."post_id" = 99'

# rails 4.2.4
post.comments.to_sql  #=> SELECT "comments".* FROM "comments"

association scopeを生成する際のunscope処理をするタイミングが誤っていたので、修正しています。


Upgrade all the gems

Gemfile.lockの修正です。

使用しているgemのバージョンをまとめて更新しています。


Merge pull request #21962 from kamipo/fix_tinyblob

Active Recordの修正です。

MySQLtinyblob型を使用している場合、dumpファイルにt.binary "tiny_blob", limit: 255が生成されていたのですが、これは誤りで、正しくt.blog"tiny_blob", limit: 255を生成するよう修正しています。

t.binary "tiny_blob", limit: 255だとvarchar(255)SQLを生成する際にvarchar(255)になってしまうとの事です。


Merge pull request #21932 from kamipo/add_stored_procedure_test_in_mysql2

ActiveRecordの修正です。

mysql2 ライブラリでストアドプロシージャのテストを行うようテストを追加しています。


Do not cache prepared statements that are unlikely to have cache hits

Active Recordの修正です。

SQLinを含む場合に、プリペアドステートメントを内部的にキャッシュしないよう修正しています。

Rails 4.2系では、プリペアドステートメントをキャッシュする為に、whereメソッドで条件をチェーンした場合に、正しくプリペアドステートメントが生成されない問題があり、その為の対応として修正したとの事です。

例。

User.where(email: 'a').where('email = :email', email: 'test').where(id: [1,2,3]).where(name: 'a');
#=> SELECT "users".* FROM "users" WHERE "users"."email" = $1 AND (email = 'test') AND "users"."id" IN (1, 2, 3) AND "users"."name" = $2  [["email", "a"], ["name", "a"]]

上記例だと本来生成されるべき、id: [1,2,3]email = 'test')のbind paramが生成されない、という問題があり出ています。なお、4.1系より前だと問題無かったとの事です。


Merge pull request #21883 from tarzan/cache-key-too-precise

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

cache_timestamp_formatナノ秒までの値を使用していたのを、マイクロ秒の値までを使用するよう修正しています。

DBがマイクロ秒までしか対応してない場合、ナノ秒まで使用してまうと、そこでずれが生じてしまい、正しくキャッシュの値が取得出来ない、という問題があった為との事です。


Don't add classes to the top level namespace

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

先のプリペアドステートメントの対応で追加されたmoduleに、Railsのnamespaceを設定するのが漏れていたので、namespaceを追加しています。

コミットメッセージに I've been writing too much Rust. My mind is still in the mode of thingsbeing auto-namespaced based on the file... とあったので、Rustだとファイル名から自動でnamespaceつけてくれる感じなんですねえ。


Fix merge conflicts for #18856

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

MySQL adapterで、table名の取得にSHOW FULL TABLESコマンドを使用していたのを、information_schema.tableから値を取得するよう修正しています。

SHOW FULL TABLESコマンドだとメタ文字を許容してしまい、正しくテーブル名の取得が出来ない恐れが有るためとの事です。例えば、SHOW TABLES LIKE 'foo_'だと、末尾1文字が異なるテーブル名があった場合に、それら全てにマッしてしまうから、ですね。


Qualify column names in calculation

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

joins + groupを使用した際に、groupに指定したカラム名が呼び出し元のtableとjoin先のテーブル両方にある場合に、SQLのエラーが発生してしまうバグがあったのを修正しています。

AuditLogs.joins(:developer).group(:id).count
# => ActiveRecord::StatementInvalid: SQLite3::SQLException: ambiguous column name: id: SELECT COUNT(*) AS count_all, id AS id FROM "audit_logs" INNER JOIN "developers" ON "developers"."id" = "audit_logs"."developer_id" GROUP BY "audit_logs"."id"

Fix test failures caused by d99db6b8b3e4

activerecord/test/cases/test_case.rbの終了です。

table名の取得を修正した対応のマージをミスってしまい、テストがコケてしまっていたのを修正しています。


Merge pull request #21302 from theunraveler/delegate_reserved_argument_names

activesupport/lib/active_support/core_ext/module/delegation.rbの修正です。

delegateメソッドに指定出来ない予約後の一覧に、"block", "args", 及び "arg"が漏れていたので、追加しています。


Set active_record config for always creating uuids in generators

activerecord/lib/rails/generators/active_record/migration/templates/create_table_migration.rbrailties/lib/rails/generators/migration.rbの修正です。

migration生成時のprimary keyのtypeを任意の型に変更する為のconfig(Rails.application.config.active_record.primary_key)を追加しています。

例。

# config/application.rb
config.active_record.primary_key = :uuid

上記設定をすると、生成されるmigration fileのcreate_table部分は、create_table :books, id: :uuidのようになります。primary keyにUUIDだけ使うような場合に便利そう。


Merge pull request #20957 from akihiro17/find-by-issue

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

find_byメソッドの引数に ActiveRecord::Relationクラスを指定した場合、値をキャシュしないよう修正しています。

異なる引数で複数回実行した場合に、値が正しく取得出来ないバグが発生してしまっており、その為に対応しています。

issue より。

good_query = Admin.find_by(group: Group.where(id: group))
# SELECT  "admins".* FROM "admins"  WHERE "admins"."group_id" IN (SELECT "groups"."id" FROM "groups"  WHERE "groups"."id" = 1) LIMIT 1

# breaks in AR 4.2
bad_query  = Admin.find_by(group_id: Group.where(id: group))
# SELECT  "admins".* FROM "admins" WHERE "admins"."group_id" = ? LIMIT 1  [["group_id", nil]]

Merge pull request #20934 from maurogeorge/migration-transformations-doc

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

migrationに使用出来るメソッドの一覧の記載が足りてなかった(create_join_tableadd_timestamps等のメソッドが不足していた)のを追加しています。


Update the changelog for #20872 to be a bit less confusing

activesupport/CHANGELOG.mdの修正です。

Round some numbers more humanely by maxjacobson · Pull Request #20872 · rails/rails の対応についてのエントリーの説明を修正しています。 あれ、PRのマージこの次だ…。


Merge pull request #20872 from maxjacobson/more-humane-rounding

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

number_to_humanメソッドで、単位が変わる直前の数字(999999)を指定した場合に、正しく上の単位で表示されていなかったのを上の単位で表示されるよう修正しています

# before
number_to_human(999_999_999) # => 1000 Million

# after
number_to_human(999_999_999) # => 1 Billion

Merge pull request #20795 from benjiwheeler/validation_guide_ret_val

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

valid? and invalid?の項に、valid?メソッドの役割についての詳細、及びerror objectについての詳細な説明を追加しています。


Merge pull request #20768 from vrybas/guides-clarify-belongs-to-required-by-default

rails guideのConfiguring Rails Applicationsの修正です。

config.active_record.belongs_to_required_by_defaultについて説明している箇所に、設定した値によりvalidation errorになる旨説明を追加しています。


Merge pull request #20737 from gouravtiwari/multibyte_chars_slice_fix

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

ActiveSupport::Multibyte::Chars#slice!メソッドに、自身の文字数以上の値を指定した場合に、NoMethodErrorが発生してしまっていたのを、Exceptionではなく、nilを返すよう修正しています。


Merge pull request #20715 from simsalabim/feature/parse-rss-atom-as-xml

actionpack/lib/action_dispatch/testing/assertions.rbの修正です。

Compare content_type with Mime::XML instead of regexp · rails/rails@4be3997 の対応により、RSS(mime: Mime::RSS)がHTMLとしてパースされるようになってしまうリグレッションが発生していたのを、正しくXMLとしてパース処理を行われるよう修正しています。


Merge pull request #20653 from repinel/allow-arel-select-count

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

aggregate系のメソッドの引数に、Arelを直接指定出来るよう対応しています。

例。

Account.sum(Account.arel_table[:credit_limit])

Arelを直接使うのをpublic APIにする訳ではないらしいので、やはり直接Arelを使うのは、極力避けた方が良さそうです。


Merge pull request #20038 from imanel/numeric_prepend

activesupport/lib/active_support/core_ext/big_decimal/conversions.rbactivesupport/lib/active_support/core_ext/numeric/conversions.rbの修正です。

Numeric関連クラス(Fixnum, Bignum, Float, BigDecimal)の拡張にalias_methodを使用していたのを、他の機能と合わせて、Module.prependメソッドを使うよう修正しています。


Collection check boxes propagates input's id to the label's for attribute.

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

Collection check boxesを使用した場合に、input要素のidの値を、labelタグのfor属性に設定するよう修正しています。


Fix minor typo from #20038

rails guideのActive Support Core Extensionsの修正です。

Merge pull request #20038 from imanel/numeric_prependの対応の際、不要なスペースが入ってしまっていたのを、削除しています。


Merge pull request #19992 from greysteil/handle-invalid-utf8-in-html-escape

activesupport/lib/active_support/core_ext/string/output_safety.rbの修正です。

ERB::Util.unwrapped_html_escapeERB::Util.html_escape_onceメソッドで、escape処理にActiveSupport::Multibyte::Unicode.tidy_bytesメソッドを使用するよう修正しています。

-        s.gsub(HTML_ESCAPE_REGEXP, HTML_ESCAPE)
+        ActiveSupport::Multibyte::Unicode.tidy_bytes(s).gsub(HTML_ESCAPE_REGEXP, HTML_ESCAPE)

元々は普通にStringとして扱っていたのですが、invalid byte sequence errorsを防ぐ為、との事です。ActiveSupport::Multibyte::Unicode.tidy_bytesメソッド、CP1252に対する考慮も入ってる感じなんですねえ。ActiveSupport::Multibyte::Unicode


Fix merge conflicts for #19938

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

ネストしたjoinを行った場合に、associationのインスタンス化処理が正しく行われないバグがあったのを修正しています。


Merge pull request #19898 from prathamesh-sonpatki/common-secrets

railties/lib/rails/generators/rails/app/templates/config/secrets.ymlの修正です。

secrets.ymlのテンプレートに各環境共通の場合の値を使用する場合のexampleを追加しています。

が、書き方に問題があり、テストが壊れてしまう問題が発生したため、後ほどrevertされています。


Merge pull request #19889 from cedrics/long-uri-encoded-keys

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

FileStoreを使用している場合のcache keyの長さチェック処理を修正しています。

元々は最初に長さのチェックをし、問題無ければそのままURI encodingしていたのを、先にURI encodingするよう修正しています。URI encodingした結果、文字が長くなってしまうケースが有るため。


Merge pull request #19851 from repinel/numericality-validation2

activemodel/lib/active_model/validations/numericality.rbの修正です。

numericality validatorにBigDecimalな値を指定した場合に、validation処理が正しく行われないバグがあったのを対応しています。


Revert " Added an example to show how common secrets can be shared across multiple environments in secrets.yml"

secrets.ymlのテンプレートに各環境共通の場合の値を使用する場合のexampleを追加した Merge pull request #19898 from prathamesh-sonpatki/common-secrets をrevertしています。

理由は先に書いた通り。


Fix test failures caused by #19851

numericality validatorにBigDecimalな値を指定した場合について対応した Merge pull request #19851 from repinel/numericality-validation2で追加されたテストの、エラーメッセージについて確認するテストに誤りがあったのを修正しています。

が、これが、あやまりで、テストの内容はあっていたけど、requireが足りてなかったようで、後ほど再度修正しています。


Really fix test failures caused by #19851

activemodel/test/cases/validations/numericality_validation_test.rbの修正です。

active_support/core_ext/big_decimalのrequireを追加、及び先のテストを元の状態に戻しています。

Active Supportが拡張しているBigDecimal#to_sメソッドを使用する前提のテストになっていた為、上記requireを追加しています。


typo

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

ExplainSubscriber#IGNORED_PAYLOADSについて説明している箇所にタイポがあったのを修正しています。


move documentation of column options to add_column. Closes #20400.

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

columnメソッドadd_columnメソッド両方で使えるオプションについては、add_columnメソッドのdocに移動しています。

元々はadd_columnメソッドにオプションについてはcolumnメソッドを参照するよう説明されていたのですが、columnメソッドの方が使えるオプションが多い(index: trueとう)ので、参照を逆にするよう修正しています。