【问题标题】:How to cache a list resulted from database in a Rails query如何在 Rails 查询中缓存来自数据库的列表
【发布时间】:2017-04-07 21:58:42
【问题描述】:

如何在 Rails 查询中缓存来自数据库的列表?

@total_untagged = Rails.cache.fetch("tags_controller/untagged/@total_untagged", expires_in: 1.hour) do
        InventoryApi::BaseEntity\
          .joins(@object_type.to_sym)
          .includes(:base_entities_tags)
          .where({ base_entities_tags: { base_entity_id: nil }})
          .size.to_int
        end

此代码正在加载 InventoryApi::BaseEntity 模型并将其保存在缓存中,键值为:

tags_controller/untagged/@total_untagged

缓存的结果是一个实例,从数据库中延迟加载,而不是作为具有字段值的类预先加载。

一旦延迟加载,读取缓存时需要再次读取数据库,实际上我没有任何缓存。

如何缓存最终结果,而不是数据库关系?

【问题讨论】:

    标签: ruby-on-rails ruby caching activerecord redis


    【解决方案1】:

    一旦保存在缓存中,它就不需要再次读取数据库,直到缓存失效。如果您在本地使用它,请记住以下几点。这是来自http://guides.rubyonrails.org/caching_with_rails.html

    要在本地使用缓存,您需要在相关的 config/environments/*.rb 中将 config.action_controller.perform_caching 设置为 true,从而在本地环境中启用缓存。

    更改 config.action_controller.perform_caching 的值只会影响 Action Controller 组件提供的缓存。例如,它不会影响低级缓存。

    【讨论】:

    • 感谢您的回答,但我的问题与此无关。我知道一旦保存在缓存中就不需要返回数据库,这就是我想要的,但是缓存的不是数据本身,而是数据库加载器,所以,一旦从缓存中读取,数据需要再次从数据库加载,这正是我想要避免的。我已经更改了配置文件,缓存正在保存和使用,但正如我所说,保存的不是我需要的。
    • 如果是这种情况,那么为什么不缓存从数据库接收到的确切结果,通过获取它而不是关系。
    • 我在问如何做到这一点。这是我的问题。
    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2016-05-18
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多