Ответ 1
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
Это очень наивная реализация, и, конечно, сохранение ключей в дополнительной структуре занимает некоторую память, но вы получаете суть.