おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

ロシアンドールキャッシュでN+1を解決する

youtube に DHH がしゃべっている動画があったので観ました。

The Complete Guide to Rails Performance という、Railsのパフォーマンスを改良するノウハウが書かれた本のコンテンツ*1の一つらしく、DHH に Rails のパフォーマンスについてインタビューをしています。

英語の聞き取りに自信がないので間違っているかもしれませんが、DHH は動画中で「Russian Doll Caching で N+1 を解決できる」ようなことを言っています。

例えば投稿の一覧と著者情報を表示したいとき、次のように書くと、二回目以降、 post が変更されない限り、post.author のクエリは実行されません。

<% cache @posts do %>
  <% @posts.each do |post| %>
    <% cache post do %>
      <%= post.title %>
      <%= render post.author %>
    <% end %>
  <% end %>
<% end %>

キャッシュが十分効いている状態では includes メソッドなどで eager loading するよりも速そうですが、個人的にはなんか怖くて手を出しにくいなという印象です。

このような書き方をしている方、他にも居るようなら話聞いてみたいなー。

*1:買いましたが絶賛積読中です><