【问题标题】:rails - using Rails.cache gives errorrails - 使用 Rails.cache 会出错
【发布时间】:2013-03-16 07:23:46
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails caching


    【解决方案1】:

    您正在尝试将 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中。

    【讨论】:

    猜你喜欢
    • 2012-10-07
    • 2018-04-24
    • 1970-01-01
    • 2011-09-17
    • 2017-10-02
    • 2017-02-18
    • 1970-01-01
    • 2011-07-24
    • 2011-10-21
    相关资源
    最近更新 更多