Как кешировать запрос в Ruby on Rails 3 - PullRequest
9 голосов
/ 19 апреля 2011

У меня есть следующий запрос в моем приложении

@categories = Category.joins(:posts).select('distinct categories.*').order('label')

Этот запрос загружается при каждом просмотре страницы, поскольку категории отображаются на каждой странице.Это кажется мне грязным, поскольку список категорий обновляется не так часто.Есть ли отличный способ кешировать только запрос?Я пробовал

   Category.cache do
      @categories = Category.joins(:posts).select('distinct categories.*').order('label')
    end

, но все равно вижу, что запрос загружается каждый раз из базы данных в журнале разработки.

Ответы [ 2 ]

19 голосов
/ 19 апреля 2011

В вашем контроллере вы можете попробовать что-то вроде:

@categories = Rails.cache.fetch('categories', :expires_in => 24.hours) { Category.joins(:posts).select('distinct categories.*').order('label') }

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

Для получения дополнительной информации я следовал следующему руководству .

Попробуйте.У меня так работает.Надеюсь, это поможет.

4 голосов
/ 19 апреля 2011

Вы можете использовать фрагментное кэширование для части вашего шаблона представления, которая отображает категории. Это означает, что категории будут обслуживаться из хранилища кэша, и запрос будет выполняться только один раз, пока срок действия кэша не истечет (с использованием метода expire_fragment).

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