непроверенный:
Cache ={}
def fetch(key, ttl)
obj, timestamp = Cache[key]
now = Time.now
if obj.nil? || now - timestamp > ttl
obj = yield
Cache[key]=[obj, now]
end
obj
end
использование:
variable = fetch(:variable, 10.seconds) { SomeModel.all }
Если nil
также является допустимым значением, просто используйте значение по умолчанию :no_value_stored
в качестве значения по умолчанию при чтении из кэша и измените блок if.
Sidenote: этот скорее всего взорвет вас, если ключей слишком много, так как хэш растет бесконечно, поэтому вы должны очистить его вручную или использовать слабые ссылки.