#tqrk10 で「私がRails 5に送ったパッチとその背景」について話してきた

TokyuRuby会議10でLTしてきた

去年に引き続き、今年もTokyuRuby会議10のLTに応募したら通ったので最近railsにマージされた僕のパッチで思い入れのある3つについて喋ってきた。今年はCookpad TechConfとかRails Upgrade Casual TalksでもRailsの話をしていて、なんか結構Railsの話するの好きだなと思った。

紹介した3つのパッチ

CGI.escapeHTML for html escape

rails/rails#22722。去年Ruby 2.3リリース前あたりにruby/ruby#1164CGI.escapeHTMLを高速化したんだけど、それをRailsのerbでも使われるようにした奴。テンプレートエンジンがレンダリング時に行なう処理の中でHTMLエスケープはそこそこ重い処理なので、ここの高速化は結構インパクトがある。

f:id:k0kubun:20160529212243p:plain

slimのベンチマークをActionView上で実行するようにしたbeforeからafterにかけて緑の部分だけ高速化された。Ruby 2.3とRails 5.0にアップグレードするとこの恩恵を受けられる。

ちなみにActionView::Template::Handlers::Erubisと表記しているのは、Railsが使ってるerb実装はオリジナルのerubisにいろいろ改良が加わっていて割と別物なので、その意味で本家と区別するため。

Allow joins to be unscoped

rails/rails#18109。あまりメンテしたがるコミッターがいないdefault_scopeのバグが一つ消せたというめでたい話をした。Rails 5からは(joinする)includes, eager_load, joinsでdefault_scopeが外せるようになる。

Rails 5でもまだバグは残っていて、preloadや(joinしない)includesに対してdefault_scopeを外す術がない。 *1 Railsコミッターも使えないよねと言っている機能を使うのはメンテされないという意味でも避けた方が無難。個人的にはそのバグは直って欲しいので再びパッチを出し直した*2

Alias left_joins to left_outer_joins

rails/rails#22125left_outer_joinsは2年くらい前からマージされて欲しいなーと思っていたパッチで、最初はouter_joinsという名前だったのが途中でleft_outer_joinsになり、いやいや長すぎでしょ…と思ってleft_joinsからも使えるようにしたのが僕のパッチ。

絞り込みのためだけのLEFT OUTER JOINもincludesでやるのが正しいみたいな認識をしている人がいて、ActiveRecord::Baseインスタンスの生成コストを軽視しているなと思うのだけど、健全な書き方をする方法がなかったのである意味しょうがなかった面もある。それがRails 5ではleft_joins使ってねと言えば済む話になるのでめでたい。

ついでにincludesを使う人の気持ちがわからないという話をした。ヒートアップしすぎてincludesと言う度に声が裏返っていたような気がする。

気持ち

相変わらず出てくる食べ物がおいしいし、日頃言いたかったことを好き放題喋れて、しかも結構いろんな人から共感が得られたしかなり楽しかった。去年はLT王の投票があまり集まらなかったけど、今年は2位だったのが結構うれしい。また参加したい。

*1: ただし https://github.com/rails/rails/pull/17360 のおかげでdefault_scopeを打ち消すunscopeを記述したassociationを定義しなおせばそこではdefault_scopeが外れる。まあ面倒なのでunscopedで外したい。

*2:https://github.com/rails/rails/pull/16367 の書き直し。書き直し前よりは仕様が改善してるけど、いろいろ突っ込みどころがあるのでこれではマージできないと思う。そのうちなんとかしたい。