ruby-on-rails - rails - 使用 Rails.cache 会出错

标签 ruby-on-rails caching

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

相关文章:

ruby-on-rails - 在处理电子邮件回复时,我怎样才能忽略任何电子邮件客户端细节和历史记录?

java - org.hibernate.cache.CacheException : On-the-fly creation of JCache Cache objects is not supported in HIBERNATE

ios - AFNetworking 在应该接收 304 时返回 200 - ETag

ruby-on-rails - 实现 has_secure_password 后出现错误消息

mysql - 更新 MySQL 中的缓存计数

linux - APC每次100%碎片

google-chrome - 用于禁用 Chrome 中所有类型缓存的命令行标志

ruby-on-rails - 如何停止批量分配?

ruby-on-rails - 设计登录根路由 rails 3

ruby-on-rails - 如何查询 Ruby 数组,就像使用 Rails ActiveRecord 一样?