2

我正在尝试缓存一个昂贵的查询,该查询在 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
4

1 回答 1

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

于 2013-03-15T23:23:46.220 回答