ActiveSupport :: Cache :: MemoryStore не обеспечивает прямой доступ к ключам хранилища (равно как и его родительский класс ActiveSupport :: Cache :: Store ).
Внутренне MemoryStore хранит все в хэше, называемом @data
, поэтому вы можете сделать обезьяны-патчи или создать подкласс для получения ключей, например ::
class InspectableMemoryStore < ActiveSupport::Cache::MemoryStore
def keys
@data.keys
end
end
ActionController::Base.cache_store = InspectableMemoryStore.new
Rails.cache.keys # => [ "foo", ... ]
Это идет с обычным предостережением, однако: внутренняя реализация MemoryStore может измениться в любое время, и @data
может исчезнуть или измениться на что-то, что не respond_to? :keys
. Более разумная реализация может заключаться в том, чтобы переопределить методы write
и delete
(поскольку, как часть общедоступного 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
Это очень наивная реализация, и, конечно, хранение ключей в дополнительной структуре требует некоторой памяти, но вы понимаете суть.