2015/10/21分のコミットです。
CHANGELOGにのったコミットは以下の通りです。
- Fix
rewhere
in ahas_many
association. - Do not cache prepared statements that are unlikely to have cache hits
- Qualify column names in calculation
- Don't cache arguments in #find_by if they are an ActiveRecord::Relation
- Fix
number_to_human
so that 999999999 rounds to "1 Billion" instead of "1000 Million". - Update
ActiveSupport::Multibyte::Chars#slice!
to returnnil
if the arguments are out of bounds, to mirror the behavior ofString#slice!
- Handle invalid UTF-8 strings when HTML escaping
Merge pull request #21858 from Gaurav2728/protected_method_nodoc
activesupport/lib/active_support/callbacks.rb
のdocの修正です。
Rails内部だけで使うメソッドに、:nodoc:
を指定しています。
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処理をするタイミングが誤っていたので、修正しています。
Gemfile.lock
の修正です。
使用しているgemのバージョンをまとめて更新しています。
Merge pull request #21962 from kamipo/fix_tinyblob
Active Recordの修正です。
MySQLのtinyblob
型を使用している場合、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の修正です。
SQLにin
を含む場合に、プリペアドステートメントを内部的にキャッシュしないよう修正しています。
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.rb
、
railties/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_table
、add_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.rb
、
activesupport/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
属性に設定するよう修正しています。
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_escape
、ERB::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処理が正しく行われないバグがあったのを対応しています。
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を追加しています。
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.rb
、
activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
のdocの修正です。
column
メソッド、add_column
メソッド両方で使えるオプションについては、add_column
メソッドのdocに移動しています。
元々はadd_column
メソッドにオプションについてはcolumn
メソッドを参照するよう説明されていたのですが、column
メソッドの方が使えるオプションが多い(index: true
とう)ので、参照を逆にするよう修正しています。