Кэширование метода, который получил условный вывод

У меня есть метод, который используется для отображения новостных статей на каждой странице. Если вы не находитесь на домашней странице по уходу, то она не будет отображать конкретные новости для этого дома. Это довольно тяжелая вещь для обработки на каждом отдельном запросе страницы. Мне было интересно, может ли кто-нибудь придумать хороший способ его кеширования.

def articles_to_show
  @articles = @care_home ? @care_home.news_items.latest.translated.limit(4).includes(:images) : Refinery::News::Item.latest.hidden_from_main.translated.limit(4).includes(:images)
end

Вот шаблон представления - http://pastebin.com/BAmgSZia

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

1 ответ

У вас уже есть некрасивый код, поэтому было бы неплохо сделать этот код немного более запутанным...

@articles = lambda { YOUR_HEAVY_CODE }

Тогда, на ваш взгляд, вы:

- cache do
  - @articles = @articles.call
  = #rest of the partial

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

  1. Связывание вашей переменной экземпляра действия с другой переменной экземпляра, вероятно инициализированной в каком-либо фильтре, является плохим примером проектирования.
  2. #articles_to_show Это плохой пример подхода REST, вместо этого вы можете сделать что-то вроде:

    class Articles::CollectionController с show метод

  3. Не используйте тернарный оператор, наверное, вообще, это так запутано. ?: синтаксис подходит только для очень простых утверждений.

  4. Не размещайте так много на контроллере, попробуйте делегировать ваши методы, области, объединяя их в другой метод - это будет чище

Другие вопросы по тегам