我使用的是Rails 3.

如何在Ruby on Rails上列出内存缓存存储中的密钥?

推荐答案

ActiveSupport::Cache::MemoryStore没有提供直接访问store 密钥的方法(其父类ActiveSupport::Cache::Store也没有).

内部MemoryStore将所有内容保存在一个名为@data的散列中,因此您可以对其进行monkey patch或子类化,以获取密钥,例如:

class InspectableMemoryStore < ActiveSupport::Cache::MemoryStore
  def keys
    @data.keys
  end
end

ActionController::Base.cache_store = InspectableMemoryStore.new

Rails.cache.keys # => [ "foo", ... ]

然而,这也带来了通常的警告:MemoryStore的内部实现可能随时发生变化,@data可能会消失或被更改为不存在的内容.更智能的实现可能是覆盖writedelete方法(因为作为公共API的一部分,它们不太可能意外更改),以保留自己的密钥列表,例如:

class InspectableMemoryStore < ActiveSupport::Cache::MemoryStore
  def write *args
    super

    @inspectable_keys[ args[0] ] = true
  end

  def delete *args
    super

    @inspectable_keys.delete args[0]
  end

  def keys
    @inspectable_keys.keys
  end
end

这是一个非常幼稚的实现,当然,将密钥保存在一个额外的 struct 中会占用一些内存,但您可以理解其中的要点.

Ruby-on-rails相关问答推荐

如何在rails 7中禁用Simple_Form验证

Rails turbo流只更新页面上的一个元素

`heroku Open`和`heroku run rake db:Migrate`不工作(";没有这样的文件或目录";)

Trailblazor 操作 -> 集合 :attribute(has_many 通过关联) 与填充器 -> 如何填充 Reform::Form 形式的 slugs 数组?

我如何在不在 gemfile 中的 rake 任务中要求 gem?

Rails - 如何从模型中查询 has_many

如何在 YAML 中声明带有单引号和双引号的字符串?

在 JS 模块中使用 Rails-UJS(带有 webpacker 的 Rails 6)

如何在 Ruby 字符串中返回最后一个斜杠(/)之后的所有内容

Rails 将 form_for 对象传递给部分

在 Nokogiri 中获取属性值以提取链接 URL

在公共 Rails 应用程序中将敏感数据存储在哪里?

如何在 Rails 中测试助手?

使 rails 控制台输出更漂亮一点

我应该将全局共享部分模板放在哪个文件夹中?

Test::Unit Rails - 如何断言一个数字大于另一个?

获取完整的 rails 控制器名称,包括命名空间

如何从 rails 控制器操作发出 404 响应?

如何在 Rails 3 中订购包含的元素

为什么 Rails 需要 JavaScript 运行时?