仅缓存rails中的主要内容

时间:2012-10-04 10:03:25

标签: ruby-on-rails caching

使用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它只缓存视图(对吗?)并且仍然必须通过控制器。

那么,我该如何解决这个问题呢?

2 个答案:

答案 0 :(得分: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 %>

答案 1 :(得分:0)

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

如果您有一个非常复杂的查询,请将其作为范围存放在控制器中,并仅在视图中对其进行评估。

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

如果您设法只在控制器中加载延迟查询,如果缓存被命中,则不会执行任何缓存查询。