2012-05-25 46 views
1

您好我有一個用戶模型,Rails.cache.fetch不緩存對象

has_many :devices 
has_many :events, :through => :devices. 

這有以下方法:

def get_events_for_devices limit=nil 
    events.limit limit 
end 

然後我有用戶的控制,我需要緩存每個用戶設備500個事件。目前我使用下面的調用

user_requested = User.find(params[:id]) 

    profile_info = Rails.cache.fetch("#{user_requested.email}-profile-info") do 
    {:user => user_requested, :devices => user_requested.devices, :events => user_requested.get_events_for_devices(500)} 

我能找回:用戶:從高速緩存設備,但不包括:事件 - 他們只是似乎沒有在那裏。

但是,如果我不使用Rails.cache,只需調用user_requested [:events],就可以獲取事件。

關於如何進行的任何想法? 謝謝!

回答

3

fetch如何工作,如果您沒有關聯的數據與給定的鍵,它會執行該塊。由於您確實擁有「#{user_requested.email} -profile-info」鍵的一些數據,因此該塊不會執行。我想如果你希望它重新計算事件數據,如果事件密鑰不存在,你應該有3種不同的獲取塊,用於3種不同類型的密鑰,例如:

profile_key = "#{user_requested.email}-profile-info" 
user_profile_data = Rails.cache.fetch("#{profile_key}:user") { user_requested } 
device_profile_data = Rails.cache.fetch("#{profile_key}:devices") { user_requested.devices } 
events_profile_data = Rails.cache.fetch("#{profile_key}:events") { user_requested.get_events_for_devices(500) }