Периодически получать некоторые данные для объекта ruby? - PullRequest
1 голос
/ 20 декабря 2011

Я знаю, что это выглядит глупо, но как я должен периодически извлекать некоторые данные в объект ruby? или после количества попыток,

Допустим, у меня есть:

 @variable = SomeModel.all 

и я не хочу получать результаты все время, чтобы я мог сделать

 @variable ||= SomeModel.all 

Но как мне делать это каждый раз, не используя что-то вроде memcache или стороннего решения? Любой хитрый способ сделать такую ​​вещь?

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

непроверенный:

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: этот скорее всего взорвет вас, если ключей слишком много, так как хэш растет бесконечно, поэтому вы должны очистить его вручную или использовать слабые ссылки.

1 голос
/ 20 декабря 2011

Сначала убедитесь, что вы храните @variable где-то, где он может сохраняться в течение многих минут (то есть он не может быть переменной экземпляра контроллера, но может быть переменной какого-либо модуля).

Далеесохраните объект DateTime, представляющий время последнего обновления переменной.Каждый раз, когда вы хотите получить доступ к переменной, проверьте, если DateTime старше 10 минут.Если он старше, обновите переменную и DateTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...