0

重いキャッシング(DHHが呼んでいるロシアの人形のキャッシング)を実行したいのですが、ユーザーとその属性に依存するコンテンツが非常に多いため、その方法がわかりません。

このようなビューでRDCをどのように実行しますか?:

<% if signed_in? %>
  <div class="timeline">
    <%= link_to image_tag(current_user.avatar), designer_path(current_user), :class => "avatar topimg" %>
    <%= content_tag(:span, "your profile", :class => "description") %>
    <%= link_to "", new_design_path, :class => "upload icon-upload" %>
    <%= content_tag(:span, "upload a new design", :class => "description") %>
    <%= link_to "", designer_path(current_user)+"/favorites", :class => "upload icon-star" unless current_user.followees_by_type("design").blank? %>
    <%= content_tag(:span, "designs you've favorited", :class => "description") unless current_user.followees_by_type("design").blank? %>
    <%= content_tag(:span, current_user.current_invites, :class => "invites_count") unless current_user.current_invites <= 0 || current_user.full_member == false %>
    <%= link_to "", "#", :class => "invite icon-plus "+("blue" unless current_user.current_invites == 0).to_s unless current_user.current_invites < 0 || current_user.full_member == false  %>
    <%= content_tag(:span, "invite a friend ("+current_user.current_invites.to_s+" invites left)", :class => "description") unless current_user.current_invites < 0  %>
    <%= content_tag(:span, activity, :class => "activity_count") unless activity == 0 %>
    <%= link_to "", designer_path(current_user)+"/statistics", :class => "upload icon-activity "+("blue" unless activity == 0).to_s unless activity == 0 %>
    <%= content_tag(:span, ("your activity ("+pluralize(activity, 'new thing')+")"), :class => "description") unless activity == 0%>
  </div>
<% else %>
  <%= link_to raw('<i class="icon-twitter icon-font"></i><span>login with twitter</span>'), "/auth/twitter", :class => "btn btn-twitter grey-tweet" %>
<% end %>
4

1 に答える 1

0

次のように、すべてを1つの大きなキャッシュブロックにラップできます。

<% cache ['timeline', @user] do %>
  ...
<% end %>

これにより、キータイムライン/#{@user.cache_key}を使用してキャッシュされます。cache_keyにはデフォルトでレコードIDとupdated_atが含まれているため、ユーザーレコードが更新されると、キャッシュされたフラグメントは自動的に無効になります*。

フラグメントでリレーション(フォロワーなど)を使用する場合は、リレーションの1つが更新されるたびにユーザーオブジェクトをタッチする必要があることに注意してください。これは、リレーションに:touch => trueを設定することで、自動的に実行できます。

class Follower
  belongs_to :user, :touch => true
  ...

(*)古いキャッシュキーは実際には無効化されていないことに注意してください。使用されなくなるだけです。キャッシュがオーバーフローしないように、すべてのキャッシュキーに有効期限を設定するか、定期的なハウスキーピングを行う必要があります。

于 2012-08-30T15:44:29.930 に答える