使用Rails 3.1.1和Heroku。
我认为这应该是一个相当简单的修复,但我找不到(并轻松验证)如何做到这一点。我有一个非常慢的控制器(6秒)Product#show
,有很多 N + 1 以及其他我需要解决的事情。
该网站是一个双栏网站(main-column
和right-column
),其中Product#show
的主要内容显示在一列中,daily product
显示在另一列中,包括“数据库中的随机产品”。
我想要做的是让main-column
创建的Product#show
中的内容被缓存(从而绕过控制器并赢得6秒)。但是,我希望正确的列是动态的(并为每个页面请求加载)。
如果我使用caches_page :show
,它会缓存整个网站,包括right-column
,这使我必须每天使缓存过期,以便能够加载新的Daily Product
。不是一个好的解决方案。
如果我使用cache('product-show' + @product.slug) do
它只缓存视图(对吗?)并且仍然必须通过控制器。
那么,我该如何解决这个问题呢?
答案 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)
使用片段缓存,不要在控制器中加载内容。
如果您有一个非常复杂的查询,请将其作为范围存放在控制器中,并仅在视图中对其进行评估。
如果您有一个复杂的过程,则必须执行查询,使用辅助方法。
如果您设法只在控制器中加载延迟查询,如果缓存被命中,则不会执行任何缓存查询。