2010-09-03 53 views
4

嗨Stackoverflowers,我已經花了太多的時間在這個問題上讓自己保持清醒,因此是時候尋求幫助......Memcached的永遠懷念(導軌)

我有一個類用這種方法:

def telecom_info 

    Rails.cache.fetch("telecom_info_for_#{ref_num}", :expires_in=> 3.hours) do 
     info = Hash.new(0) 
     Telecom::SERVICES.each do |source| 
      results = TelecomUsage.find(:all, 
             :joins=>[:telecom_invoice=>{ :person=> :org_person}], 
             :conditions=>"dotted_ids like '%#{ref_num}%' and telecom_usages.ruby_type = '#{source}'", 
             :select=>"avg(charge) #{source.upcase}_AVG_CHARGE, 
               max(charge) #{source.upcase}_MAX_CHARGE, 
               min(charge) #{source.upcase}_MIN_CHARGE, 
               sum(charge) #{source.upcase}_CHARGE, 

               avg(volume) #{source.upcase}_AVG_VOLUME, 
               max(volume) #{source.upcase}_MAX_VOLUME, 
               min(volume) #{source.upcase}_MIN_VOLUME, 
               sum(volume) #{source.upcase}_VOLUME 
               ") 

      results = results.first 
      ['charge', 'volume'].each do |source_type|           
      info["#{source}_#{source_type}".to_sym] = results.send("#{source}_#{source_type}".downcase).to_i 
      info["#{source}_min_#{source_type}".to_sym] = results.send("#{source}_min_#{source_type}".downcase).to_i 
      info["#{source}_max_#{source_type}".to_sym] = results.send("#{source}_max_#{source_type}".downcase).to_i 
      info["#{source}_avg_#{source_type}".to_sym] = results.send("#{source}_avg_#{source_type}".downcase).to_i 
      end 
     end 

     return info 
    end 
end 

正如您所看到的,這是一個昂貴的調用,並且它對每個請求都稱爲ALOT,所以我想緩存它。問題是,memcached的似乎不工作,在日誌文件中,我得到:

緩存讀取:telecom_info_for_60000000

緩存未命中:telecom_info_for_60000000({})

奇怪的是,我知道memcached的工作,因爲它不緩存的其他一些功能我已經在另一個模型的結果。

有什麼建議嗎?我對REE 1.8.7

+0

不知道有一種花叫stackover。哈哈哈。 – 2010-09-03 15:16:51

回答

7

運行的Rails 2.3.5與info更換return info

Rails.cache.fetch("telecom_info_for_#{ref_num}", :expires_in=> 3.hours) do 
    # ... 
    info 
end 

return關鍵字總是從當前方法,這意味着info永遠不會返回到您的來電Rails.cache.fetch返回,也不是以往任何時候都執行該方法的其餘部分。當最後一個語句簡單是info,這是一個將給予Rails.cache.fetch的價值,你會允許該方法通過存儲在緩存中這個值來完成其任務。

比較如下:

def my_method 
    1.upto(3) do |i| 
    # Calling return immediately causes Ruby to exit the current method. 
    return i 
    end 
end 

my_method 
#=> 1 

作爲一個經驗法則:總是忽略return,除非你真的要退出當前塊,並從當前方法返回。

+0

混淆.. O_O(至少一個Ruby/RoR的初學者) – randomguy 2010-09-03 15:20:46

+0

謝謝,不再回我呢! ;-) – Alain 2010-09-03 17:06:18