2013-02-25 44 views
0

在我的用戶模型中,我有一個friends方法,該方法返回所有用戶的Facebook好友的散列。在我看來,我遍歷整個列表以按字母順序對列表進行分頁。我不知道我的服務器運行是否真的很慢,或者這是非常低效的。我怎樣才能使這個過程更快?可能創建一個friends模型更好嗎?請讓我知道,如果我的方法效率低下,爲什麼,以及我如何能夠使其更快。謝謝!迭代get_connections(「我」,「朋友」)...這是低效的嗎?

在我的Home.html.erb視圖中,我有<%letter ='a'%>,當用戶選擇另一個字母並刷新頁面時,該視圖發生更改。

<% current_user.friends.each do |user| %> 
    <% if user['name'].downcase.start_with? letter %> 
     do something 
<% end %> 

用戶模型

def facebook 
    @facebook ||= Koala::Facebook::API.new(token) 
    block_given? ? yield(@facebook) : @facebook 
rescue Koala::Facebook::APIError => e 
    logger.info e.to_s 
    nil 
end 

def friends 
    facebook {|fb| fb.get_connections("me","friends")}.sort{|a,b| a['name']<=>b['name']} 
end 

回答

0

您正在爲每個請求進行外部API調用。加上用戶可能有好幾個像500,1000的朋友。

我在我的fb應用程序處理後臺作業(延遲作業)中的數據。您可以使用resque或sidekiq或其他背景來處理用戶數據。

我建議你製作好友模型並與用戶模型建立關聯。那麼,如果你有一些n + 1查詢問題,你可以使用includes而不是使用sort使用order它會比sort快得多。此外,而不是使用each使用find_each它會處理塊中的數據,你可以谷歌每個和find_each之間的差異。希望這會有所幫助

0

一兩件事,將趨緩每個請求可以肯定的是,你在做請求中間的外部API調用的事實。第二件要注意的是,你可能會帶回大量的數據,很容易進入數百甚至數千。

處理此問題的更合適的方法是創建一個Friend模型,其中每個朋友都具有與該用戶的所有關係。在後臺處理器(即延遲作業,resque,sidekiq)中,遍歷用戶並在您的服務器可以容忍的某個時間間隔更新他們的朋友。這將導致用戶的朋友何時會出現延遲。您必須成爲裁判才能容忍的延遲時間,這很大程度上取決於您的用戶數量和硬件預算。

這實際上是一個緩存機制,您可能想要說明數據將會更改,朋友可能會被刪除等事實。您可以刪除所有朋友,並在每次刷新時重新創建整個列表。在事務內部這樣做會使刪除不被顯示直到它被提交。

相關問題