我正在尝试缓存一个昂贵的查询,该查询在 Rails 3 中整个站点的多个请求中重复使用。
当用户点击表格查看报告或当用户点击查看 map 或当用户点击打印某些内容时,将执行此查询:
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
最佳答案
您正在尝试将 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 中。
关于ruby-on-rails - rails - 使用 Rails.cache 会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15442194/