我正在尝试缓存在Rails 3中整个站点的多个请求中重用的昂贵查询。
当用户点击表格查看报告或用户点击查看地图或用户点击打印某些内容时,会执行此查询:
reports.where{(time > my{range.begin}) & (time < my{range.end})}
这是一个昂贵的查询,可以产生数千条记录。我想缓存它,所以在第一次调用它之后,它被存储在缓存中,直到查询中的一个记录被修改(例如更新)。
我用这个替换我的查询:
Rails.cache.fetch('time_reports') { reports.where{(time > my{range.begin}) & (time < my{range.end})} }
但它提出了一个例外:
TypeError (can't dump anonymous class #<Module:0x007f8f92fbd2f8>):
作为问题的一部分,我想知道使用Rails.cache.fetch是否还要求我在config / environments / production.rb中添加以下内容:
config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com" //obviously I would use my ip
答案 0 :(得分:6)
您正在尝试将Arel关系转储到缓存存储中,遗憾的是这是不可能的。您想要转储结果数组,所以请改为:
Rails.cache.fetch('time_reports') { reports.where{(time > my{range.begin}) & (time < my{range.end})}.all }
...或...
Rails.cache.fetch('time_reports') { reports.where{(time > my{range.begin}) & (time < my{range.end})}.to_a }
这将导致关系成为一个真正的数组,你可以按照正常情况存储在memcached中。