2012-08-28 83 views
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 %> 
+0

[俄羅斯玩偶緩存在rails中可能的重複](http://stackoverflow.com/questions/12153721/russian-doll-caching-in-rails) –

回答

0

你可以用整個事情在一個大的緩存塊如下:

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

這將使用緩存它關鍵時間線/#{@user.cache_key}。 cache_key默認包含記錄ID和updated_at,所以一旦用戶記錄被更新,緩存的片段就會自動失效。

請注意,如果您在片段中使用關係(例如關注者),則每次更新其中一個關係時都應觸摸用戶對象。這可以通過自動設置來完成:觸摸=>在關係上真正的,因爲這樣的:

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

(*)請注意,過時的緩存鍵是不是真的失效,它只是不再使用。您應該對所有緩存鍵設置過期時間,或者進行一些常規內務管理以避免緩存溢出。