Rails.cache.fetch没有缓存对象

时间:2012-05-25 18:25:36

标签: ruby-on-rails ruby caching object 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)}

我能够从缓存中取回:user和:设备,但不能取回:事件 - 它们似乎不存在。

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

关于我应该如何进行的任何想法? 谢谢!

1 个答案:

答案 0 :(得分: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) }