0

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

那么,我该如何解决呢?

4

2 回答 2

1

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

def show

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

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

end

显示.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 %>
于 2012-10-04T10:39:08.373 回答
0

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

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

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

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

于 2012-10-04T11:07:32.527 回答