フラグメントキャッシュをRailsで使う。

Tsukasa OISHI

 ようやくといっていいと思うけど、kaeruspoonにキャッシュ機能を追加しました。
 Railsでは三つのキャッシュ機能があります。ページキャッシュにアクションキャッシュ、そしてフラグメントキャッシュです。今回はフラグメントキャッシュを使ってみました。
 使いかたはとても簡単で、キャッシュしたいビューの部分をcacheブロックに入れるだけ。

<% cache(:action => :view_item, :part => :amazon) do -%>
<%= view_amazon_items @amazon_items %>
<% end -%>
<% cache(:action => :view_item, :part => :youtube) do -%>
<%= view_youtube_items @youtube_items %>
<% end -%>
<% cache(:action => :view_item, :part => :tags) do -%>
<%= view_all_tags @all_tags %>
<% end -%>
<% cache(:action => :view_item, :part => :count) do -%>
<%= view_count @count %>
<% end -%>

 ひとつひとつのキャッシュを区別するために、アクションとパートでユニークにします。パートは任意の文字列かシンボルでOK。これだけで、次回からこの部分を表示するときにキャッシュが使用されます。
 このままだとキャッシュ部分の内容が更新されても表示が反映されません。更新時はキャッシュを無効にしてしまいます。

    Diary.find(params[:id]).destroy_with_tag
    expire_fragment(:action => :view_item, :part => :amazon)
    expire_fragment(:action => :view_item, :part => :youtube)
    expire_fragment(:action => :view_item, :part => :tags)

これでOK。さらに、コントローラ内で、キャッシュ済みのデータは取得しないようにもできます。これでさらに高速化が望めます。

    @count = Counter.top_count unless read_fragment(:action => :view_item, :part => :count)
    @all_tags = Tag.get_all_tags unless read_fragment(:action => :view_item, :part => :tags)
    @amazon_items = AmazonList.get_items unless read_fragment(:action => :view_item, :part => :amazon)
    @youtube_items = YoutubeList.get_items unless read_fragment(:action => :view_item, :part => :youtube)

とても簡単ですね。

I read paperbacks when I go to work by train. I often worry that if I'm talked from a foreigner in English, I wouldn't know what I should do. Surely I've been reading books which was written in English. But I couldn't speak English and understand what a foreigner talks.