#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#1164でCGI.escapeHTML
を高速化したんだけど、それをRailsのerbでも使われるようにした奴。テンプレートエンジンがレンダリング時に行なう処理の中でHTMLエスケープはそこそこ重い処理なので、ここの高速化は結構インパクトがある。
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#22125。left_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 の書き直し。書き直し前よりは仕様が改善してるけど、いろいろ突っ込みどころがあるのでこれではマージできないと思う。そのうちなんとかしたい。