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

我已经尝试对它进行片段缓存,但后来我意识到如果它过期并且第一个请求是疗养院的请求,那么新闻文章将被错误地填充。

4

1 回答 1

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. 不要给控制器放太多东西,尝试通过将它们合并到另一个方法中来委派你的方法和范围——这样会更干净

于 2013-12-15T20:42:38.033 回答