缓存一个有条件输出的方法

时间:2013-12-15 18:05:14

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 refinerycms refinery

我有一个方法用于在每个页面上呈现新闻文章。如果您不在护理主页上,那么它不会向该家庭呈现特定新闻。处理每个页面请求都非常繁重。我想知道是否有人能想出一个很好的缓存方法。

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 个答案:

答案 0 :(得分:0)

你已经拥有丑陋的代码,所以让这段代码变得更加模糊不是很糟糕......

@articles = lambda { YOUR_HEAVY_CODE }

然后在你看来你是:

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

值得一提的是,如果您不能使用任何嵌入式和建议的缓存方式,那么您的设计可能有问题。

  1. 将您的动作实例变量与可能在某些过滤器中初始化的其他实例变量相关联,这是一个糟糕的设计示例。
  2. #articles_to_show这是REST方法的一个不好的例子,你可以改为:

    使用class Articles::CollectionController方法

  3. show

  4. 不要使用ternarny运算符,可能根本就是混淆了。 ?:语法仅适用于非常简单的语句。

  5. 不要将太多的东西放在控制器上,尝试通过将它们合并到另一种方法来委托你的方法,范围 - 它会更清洁