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::CollectionControllershow方法

  3. 不要使用ternarny运营商,可能在所有的,它是如此模糊。 ?:语法仅适用于非常简单的语句。

  4. 不要把这么多的控​​制器,尝试通过将它们合并到另一种方法来委托你的方法,范围 - 这将是清洁

+0

事实上,这是丑陋的,不幸的是它的代码中,我从之前的开发者手中接管,这是一个我想要随着时间推移而改进的背负式项目。我很欣赏这些建议,这绝对是一种更好的方式。在该方法实际上是在应用程序帮手,即使在控制器!几乎每一页都会调用helper方法,因为它的视图模板无处不在。 – Callum

+0

哦,生病了......我的回答大部分都是不正确的,因为它是一个帮手。但是你仍然可以通过块使用延迟加载。这是有问题的方法,但工作就像这个应用程序的其余部分... –