2012-10-04 3 views
0

Rails 3.1.1과 Heroku를 사용합니다.레일의 주요 내용 만 캐시합니다.

나는 이것이 꽤 쉬운 수정이어야한다고 나는 믿는다. 그러나 이것을하는 법을 쉽게 (그리고 쉽게) 확인 할 수 없다. 나는 N + 1과 내가 해결해야 할 다른 것들이 많이있는 매우 느린 컨트롤러 (6 초) Product#show을 가지고있다.

웹 사이트는 Product#show에서 주 내용으로 한 열에 표시됩니다 및 daily product"데이터베이스에서 임의의 제품"을 포함하여 기타에 표시됩니다 두 개의 열이 웹 사이트 (main-columnright-column)입니다. 내가 원하는 무엇

Product#show에 의해 만들어진 main-column의 내용은 캐시 할 수 있도록 (및 컨트롤러를 무시하고 6 초 우승)하는 것입니다. 그러나 오른쪽 열이 동적이어야하고 각 페이지 요청마다로드해야합니다. 내가 caches_page :show를 사용하는 경우

그것은 나에게 새로운 Daily Product로드 할 수 있도록하기 위해 매일 캐시를 만료해야하게 right-column 포함한 전체 웹 사이트를 캐시합니다. 좋은 해결책은 아닙니다.

cache('product-show' + @product.slug) do을 사용하는 경우보기 (오른쪽?) 만 캐시되지만 여전히 컨트롤러를 통과해야합니다.

어떻게 해결할 수 있습니까?

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 %> 
+0

다음은 조각 캐싱을 사용해야하는 경우입니다. http://guides.rubyonrails.org/caching_with_rails.html#fragment-caching – emrahbasman

+0

조각 캐싱을 사용하면 컨트롤러가로드됩니다! 액션 캐싱이 (내 연구에 따라) 올바른 선택 인 것 같지만 그것이 작동하는지 확인할 수 없으므로 누군가 확인하기를 바라고 있습니다. – Christoffer

답변

1

는 아래처럼 조각 캐싱으로이 작업을 수행 할 수 있습니다.

매우 복잡한 쿼리를 사용하는 경우 컨트롤러에서 범위로 살며보기에서만 평가하십시오.

쿼리를 실행해야하는 복잡한 프로세스가있는 경우 도우미 메서드를 사용하십시오.

컨트롤러에서 지연 쿼리를로드하는 경우 캐시가 실행되면 아무 것도 실행되지 않습니다.

+0

고마워요, 그 속임수를했습니다. 더 "우아한"것이있을 것이라고 생각했습니다. 액션 캐싱은 내가 찾고있는 것 같았지만 웹 사이트의 다른 기능에 문제가있었습니다 (내 웹 사이트에 대해 매우 구체적이며이 문제와 관련이 없음). 그러나 이것은 일했습니다, 고마워요 !! – Christoffer

0

를 사용하여 조각 캐싱을하고, 컨트롤러에 물건을 넣지 마십시오 :