0

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

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

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

ответ

0

Вы уродливый код уже поэтому он не будет очень плохо, чтобы сделать этот код немного больше обфусцированный ...

@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. Не используйте ternarny оператор, вероятно, вообще, это так обфусцированный. Синтаксис ?: подходит только для очень простых утверждений.

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

+0

Действительно, это некрасиво, к сожалению, это код, который я взятый из предыдущего разработчика, это своего рода проект с обратной записью, который я хочу улучшить со временем. Я ценю рекомендации, это определенно лучший способ пойти. В тот момент, когда этот метод действительно находится в помощнике приложения, даже не в контроллере! Вспомогательный метод называется почти на каждой странице, поскольку его шаблон представления отображается повсюду. – Callum

+0

О, больно ... Большинство моих ответов не так, потому что это помощник. Но вы по-прежнему можете использовать ленивую загрузку по блокам. Это проблематичный подход, но работает так же, как и остальная часть этого приложения ... –

Смежные вопросы