【问题标题】:Rails.cache.fetch not caching objectRails.cache.fetch 不缓存对象
【发布时间】:2012-07-16 14:46:36
【问题描述】:

嗨,我有一个用户模型

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]。

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

【问题讨论】:

    标签: ruby-on-rails ruby caching object fetch


    【解决方案1】:

    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) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 2012-08-04
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多