0

Rails 3.1.1 と Heroku を使用しています。

これはかなり簡単な修正であると思いますが、これを行う方法を見つけることができません (そして簡単に確認することもできません)。私は非常に遅いコントローラー (6 秒)を持っており、解決しなければならないProduct#show多くのN+1やその他の問題があります。

この Web サイトは 2 列の Web サイト (main-columnおよび) であり、 「データベースからのランダムな製品」を含む のright-columnメイン コンテンツProduct#showが 1 つの列に表示され、もう 1 つの列に表示されます。daily product

私がやりたいことは、main-column作成されたコンテンツをProduct#showキャッシュできるようにすることです (したがって、コントローラーをバイパスして 6 秒勝ちます)。ただし、右側の列を動的にする (そしてページ要求ごとにロードする) ことを望みます。

これを使用caches_page :showすると、 を含む Web サイト全体がキャッシュ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

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 %>
于 2012-10-04T10:39:08.373 に答える
0

フラグメント キャッシングを使用し、コントローラーに物をロードしないでください。

非常に複雑なクエリがある場合は、スコープとしてコントローラーに存在させ、ビューでのみ評価します。

クエリを実行する必要がある複雑なプロセスがある場合は、ヘルパー メソッドを使用します。

コントローラーに遅延クエリをロードすることができた場合、キャッシュがヒットした場合、それらはどれも実行されません。

于 2012-10-04T11:07:32.527 に答える