2015/08/02分のコミットです。
CHANGELOGにのったコミットは以下の通りです。
ActiveRecordの修正です。
ActiveRecord::Relation
にcache keyを生成するためのcache_key
メソッドを追加しています。
実行例。
User.all.cache_key (0.1ms) SELECT COUNT(*) AS size, MAX("users"."updated_at") AS timestamp FROM "users" # => "users/query-211ae6b96ec456b8d7a24ad5fa2f8ad4-1-20150801035830982913000" User.where(admin: false).cache_key (0.5ms) SELECT COUNT(*) AS size, MAX("users"."updated_at") AS timestamp FROM "users" WHERE "users"."admin" = ? [["admin", false]] # => "users/query-6a867350e8bd70c9ac82317c95157632-1-20150801035830982913000"
指定した条件に一致するデータの個数、特定のカラムの最大値を取得し、それらを元にkeyを作成しているようです。
なお、元となるカラムはデフォルトではupdated_at
ですが、cache_key
メソッドの引数に任意のカラム名を可能です。
Product.where("name like ?", "%Game%").cache_key(:last_reviewed_at)
Fix test failures caused by #20884
activerecord/lib/active_record/collection_cache_key.rb
の修正です。
先に追加されたcache_key
メソッドで、データの個数と最大値を取得する際に、unscope
メソッドでorder byを削除するよう修正しています。
- query = collection.select("COUNT(*) AS size", "MAX(#{column}) AS timestamp") + query = collection + .select("COUNT(*) AS size", "MAX(#{column}) AS timestamp") + .unscope(:order)
集約関数 + order by はエラーになってしまう為、かつ、cache keyの生成にorderは不要との事で削除するよう修正したようです。
correct example of button_tag [ci skip]
rails guideのWorking with JavaScript in Rails
の修正です。
button_tag
メソッドの実行結果を実際の実行結果と異なっていたの(不要なdivタグがあった)を修正しています。
Use #start_with? and #[] for speed
actionpack/lib/action_dispatch/routing/route_set.rb
の修正です。
先日行われた性能改善の対応のフォローアップです。
normalize_controller
メソッドでleading slashを削除するのに正規表現でチェックを行っていたのを、#start_with? and #[]を使用するよう修正しています。
- if m = controller.match(/\A\/(?<controller_without_leading_slash>.*)/) - @options[:controller] = m[:controller_without_leading_slash] + if controller.start_with?("/".freeze) + @options[:controller] = controller[1..-1]
Save a string allocation inside loop
actionview/lib/action_view/helpers/tag_helper.rb
の修正です。
tag_options
メソッドで結果の文字列を生成する際に、String#+
ではなく、String#<<
を使うようにし、不要なString objectを生成されないよう改善しています。
こちらも先日行われた性能改善のフォローアップです。
String#+
とString#<<
のベンチマークは下記。
require 'benchmark/ips' sep = " ".freeze Benchmark.ips do |x| x.report("string +") { output = "" output << sep + "foo" } x.report("string <<") { output = "" output << sep output << "foo" } x.compare! end
Calculating ------------------------------------- string + 88.086k i/100ms string << 94.287k i/100ms ------------------------------------------------- string + 2.407M (± 5.8%) i/s - 12.068M string << 2.591M (± 7.0%) i/s - 12.917M Comparison: string <<: 2591482.4 i/s string +: 2406883.7 i/s - 1.08x slower