Для этого вы можете использовать встроенный кеш Rails:
@history = Rails.cache.fetch('parsed_myservice_data', :expires_in => 1.minute) do
JSON.parse connector.get_response("http://myservice")
end
Одна из проблем этого подхода заключается в том, что для восстановления кэшируемых данных требуется
довольно долго. Если за это время вы получите много запросов от клиентов, каждый из них будет
получите ошибку в кеше и вызовите свой блок, что приведет к большим дублирующим усилиям, не говоря уже о медленном времени отклика.
РЕДАКТИРОВАНИЕ: В Rails 3.x вы можете передать параметр :race_condition_ttl
методу fetch
, чтобы избежать этой проблемы. Подробнее об этом здесь .
Хорошим решением этой проблемы в предыдущих версиях Rails является настройка фонового задания / cron, которое будет запускаться через регулярные промежутки времени, которое будет извлекать и анализировать данные и обновлять кэш.
В вашем контроллере или модели:
@history = Rails.cache.fetch('parsed_myservice_data') do
JSON.parse connector.get_response("http://myservice")
end
На вашем задании / cron:
Rails.cache.write('parsed_myservice_data',
JSON.parse connector.get_response("http://myservice"))
Таким образом, ваши клиентские запросы всегда будут получать свежие кэшированные данные (за исключением первого
запросить, если фоновое задание / cron еще не выполнено.)