2013-09-01 2 views
0

나는 그 종류의 스크립트를 가지고있다.모든 쿼리를 캐싱하는 레일

Search_controller.rb :

def results 
    @users = @search.cached_users_count.page(params[:page]).per_page(10) 
end 

Search.rb 모델 :

users = users.order('current_sign_in_at DESC') 


def cached_users_count 

    Rails.cache.fetch(["user_count", expires_in: 5.minutes]) { users } 

end 

내가 뭘 원하는 것은 캐시가 모든 쿼리 일부 사용자가 검색 결과를 실행 후 로그인 할 때 때문에, 대체 will_paginate 다음 페이지의 결과 - 로그인 한 사용자가 첫 번째 위치로 이동하여 결과가 주문에 따라 변경되었으므로 current_sign_in_at

누군가가 도와 줄 수 있습니까? 지금은 캐시가 만들어지지 않습니다. 모든 검색 결과에 대해 theres는 SQL 응답입니다.

답변

2

찾고있는 동작을 얻기 위해 현재 구현에서 변경해야 할 사항이 몇 가지 있습니다. 예상대로 결과를 저장하지 않는 것을 의미

  1. 당신이 관계를 반환으로 시작하고있는 users 객체

    하지만 에만 범위. 쿼리 결과를 저장하려면 쿼리 메서드를 사용하여로드해야합니다. all 레일 4의 경우 레일 3의 경우, 또는 load 사용하여 레일 캐시

    users.order('current_sign_in_at DESC').all #Rails 3 
    users.order('current_sign_in_at DESC').load #Rails 4, all is deprecated 
    
  2. 구문은 당신이 정말로 만료 에 원하는 경우 올바르지 않습니다. 키의 일부로 expires_in을 전달 중입니다. 현재 코드에 배열 []입니다. 평범한 매개 변수를 전달하고 expires_in을 옵션으로 전달하려고합니다. Confusion caching Active Record queries with Rails.cache.fetch

    :
    Rails.cache.fetch("user_count", expires_in: 5.minutes) { users } 
    

는 SO뿐만 아니라에 비슷한 질문에 대해 다음을 참조하십시오
관련 문제