1

嗨我有一个用户模型

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 和 :devices ,但不能取回 :events - 它们似乎不存在。

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

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

4

1 回答 1

4

fetch的工作原理是,如果您没有与给定键关联的数据,它将执行该块。由于您确实有一些“#{user_requested.email}-profile-info”键的数据,因此不会执行该块。我认为,如果您希望它在 events 键不存在的情况下重新计算事件数据,您应该为 3 种不同类型的键设置 3 个不同的 fetch 块,如下所示:

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) }
于 2012-07-16T06:46:36.100 回答