なるようになるブログ

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

rails commit log流し読み(2015/08/02)

2015/08/02分のコミットです。

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

activerecord/CHANGELOG.md


Merge pull request #20884

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