2010-05-01 118 views
0

當我有2個視圖片段緩存相同的查詢,但顯示它們不同,只有一個片段,他們都顯示相同的方式。有沒有辦法解決?例如...Memcached和Rails片段緩存問題

#views/posts/list 
    - cache(@posts) do 
     - for p in @posts 
       = p.title 

#views/posts/list_with_images 
    - cache(@posts) do 
     - for p in @posts 
       = p.title 
       = p.content 
       = image_tag(p.image_url) 

#controllers/posts_controller 
    def list 
     ... 
     @posts = Post.all 
    end 

    def list_with_images 
     ... 
     @posts = Post.all 
    end 

回答

5

您必須使用唯一的緩存密鑰。如果你簡單地傳入一個對象,它會調用它的cache_key方法來確定密鑰。如果傳入一組對象,則cache將通過連接數組中所有元素的緩存鍵來生成密鑰。您可以使用它來解決您的問題:

#views/posts/list 
    - cache([:list, @posts]) do 
     - for p in @posts 
       = p.title 

#views/posts/list_with_images 
    - cache([:list_with_images, @posts]) do 
     - for p in @posts 
       = p.title 
       = p.content 
       = image_tag(p.image_url) 
1

我想通了。

首先,這個策略的要點是利用rails中的智能緩存鍵,它根據模型名稱,ID和updated_at屬性自動生成唯一鍵。

如果您有涉及兩個模型的內容,該怎麼辦?有一個約定這個內置的,您只需使用一個數組:

- cache([@posts, @user]) do 

而這只是一個附加用戶關鍵崗位的關鍵,因此,如果要麼更新緩存自動失效。您可以使用相同的約定以簡單字符串的形式向密鑰添加附加信息。這對區分使用相同查詢但需要不同視圖的片段很有用,並且是上述問題的答案。

- cache([@posts, "lists"]) do 

,然後在其他頁面使用

- cache([@posts, "list_with_images"]) do 

,這將創建不能相互混淆兩個獨立的片段。