2015-04-08 2 views
3

У меня есть база данных, которая обновляется один раз в день. Вместо того, чтобы запрашивать его в моем контроллере каждый раз, когда пользователь делает запрос, например:Rails присваивает значение переменной один раз в день

@rainy = Place.where("forecast = 'rain'")

Могу ли я запустить этот запрос только один раз в день, после обновления БД и сделать значение доступно в переменном, мой контроллер может получить доступ?

ответ

3

Вы можете, но это не очень хорошее решение. У Rails уже есть способ сохранить результат дорогостоящих вычислений по всем запросам: кэширование.

Использование

@rainy = Rails.cache.fetch(:rainy, expires_in: 1.day) do 
    Place.where(forecast: 'rain') 
end 

Если вам нужно значение истекает в определенное время каждый день, вы можете определить задачу рейки, которая вычисляет значение, а затем истекает кэш:

# lib/tasks/rainy.rake 
task :compute_rainy 
    # ... whatever comutation produces your database value ... 

    # Then, expire the cache for :rainy so that the next 
    # request loads (and caches) the new value 
    Rails.cache.delete(:rainy) 
end