【问题标题】:Cache only the main content in rails只缓存rails中的主要内容
【发布时间】:2012-09-25 08:21:15
【问题描述】:

使用 Rails 3.1.1 和 Heroku。

我相信这应该是一个相当容易解决的问题,但我找不到(也很容易验证)如何做到这一点。我有一个非常慢的控制器(6 秒)Product#show,有很多 N+1 和其他我必须解决的问题。

该网站是一个两栏网站(main-columnright-column),其中Product#show 的主要内容显示在一栏,daily product 显示在另一栏,包括一个“随机数据库中的产品”

我想要做的是让main-column中由Product#show创建的内容被缓存(从而绕过控制器并赢得6秒)。但是,我确实希望右列是动态的(并为每个页面请求加载)。

如果我使用caches_page :show,它将缓存整个网站,包括right-column,这使我必须每天使缓存过期才能加载新的Daily Product。不是一个好的解决方案。

如果我使用cache('product-show' + @product.slug) do,它只会缓存视图(对吗?)并且仍然需要通过控制器。

那么,我该如何解决呢?

【问题讨论】:

标签: ruby-on-rails caching


【解决方案1】:

您可以通过片段缓存来实现这一点,如下所示:

def show

  if !fragment_exist?("main_content")
    @products = Product.all
    @users_count = User.count
  end

  @random_products = Product.order("RANDOM()").limit(10)

end

show.html.erb

<!--MAIN CONTENT-->
<% cache("main_content") do %>
    <%= @users_count %>
    <% @products.each do |product| %>
        <%= product.name %>
    <% end %>
<% end %>

<!--SIDE CONTENT-->
<% @random_products.each do %>
    <%= product.name %>  
<% end %>

【讨论】:

  • 谢谢,成功了。以为会有更“优雅”的东西。动作缓存似乎是我一直在寻找的东西,但后来我在网站上的其他功能上遇到了问题(高度特定于我的网站,与这个问题无关)。但这行得通,谢谢!!
【解决方案2】:

使用片段缓存,不要在控制器中加载东西。

如果你有一个非常复杂的查询,让它作为一个范围存在于控制器中,并且只在视图中评估它。

如果您有一个复杂的过程,必须执行查询,请使用辅助方法。

如果你设法在控制器中加载惰性查询,如果缓存被命中,它们都不会被执行。

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2022-01-15
    • 1970-01-01
    • 2012-06-02
    • 2011-02-24
    相关资源
    最近更新 更多