2011-03-28 57 views
6

我的項目實現了'使用Twitter登錄'OAuth舞蹈,並呈現顯示當前用戶所有用戶的頁面。在Rails中緩存Twitter API調用

# /views/user/show.html.erb 

<h1>Users You Follow</h1> 

<%= render :partial => 'followed_user', :collection => @current_user.following %> 

following是用戶模型的虛擬屬性。

# /users/models/user.rb 

def following 
    result = twitter_request_authenticated('get_following') 
    parse_body(result) 
end 

首先,因爲我是新來的Rails(和MVC)我要問:這是一個合適的抽象?這些'跟隨用戶'自己應該建模嗎?

而現在真正的問題:

擊中Twitter的每個頁面加載此信息似乎沒有必要。 如果我們想要在給定的時間段內緩存這樣的API調用的結果(並且創建一個可方便地刷新該緩存的方法),我們該如何去做呢?這僅僅是一個問題:將API調用的返回值與「expiry」列一起存儲在數據庫列中,並且只在該列值爲空或cache_expires <時才調用API?如果是這樣,這聽起來像它可能會更好地位於自己的模型。思考?

回答

11

如果您希望緩存在一段時間後過期,您可能需要使用Memcached。 Memcached允許您指定緩存的到期時間。一旦你的Rails配置爲使用Memcached的作爲默認的緩存解決方案,你可以做到以下幾點:

def following 
    Rails.cache.fetch("following/#{id}", :expires_in => 1.hour) do 
    result = twitter_request_authenticated('get_following') 
    parse_body(result) 
    end 
end 

這將緩存以下列表,在內存中,1小時,而高速緩存將是唯一的每個用戶。然後,您可以手動使用此命令在任何時候終止此緩存:

Rails.cache.delete("following/#{id}") # where id is the user's id 

要獲得Ruby on Rails的緩存開始退房this指南。

P.S:我認爲你沒有爲每個用戶建模current_user的方法非常好。如果你想對這些用戶執行一組完整的操作,那麼可能需要爲TwitterUser創建一個單獨的模型,但是我不會合並User和TwitterUser,因爲它們可能完全不同。例如,隨機的TwitterUser可能沒有在您的系統中授權,並且可能無法登錄,因爲系統的用戶正在關注它們。

+0

感謝潘,只是設置了memcached,它的工作很棒! – cantlin 2011-03-28 16:25:37