2012-09-06 2 views
1

프로필에있는 조회수를 기반으로 내 홈페이지에 사용자를 표시하려고합니다. 사용자는 페이지가 매겨지고 프로필을 볼 때마다 캐시를 ​​무효화하려고합니다.레일즈는 질의 결과 대신 캐싱 질의를 유지합니다.

내 컨트롤러 코드 :

def index 
    @users = Rails.cache.read(params[:page]) 
    if [email protected]? 
    flash[:info] = "Cache was hit." 
    else 
    flash[:info] = "Miss." 
    @users = User.paginate(page: params[:page], per_page: 5, order: "views DESC") 
    Rails.cache.write(params[:page], @users) 
    end 
end 

처음 2 페이지로 이동

, 나는 예상대로 캐시 미스를 얻을, 나는 새로 고칠 때 예상대로, 나는 또한, 캐시 히트를 얻을. 그러나 콘솔을 통해 사용자의 views을 수동으로 변경하고 페이지 2를 새로 고치면 콘솔에서 변경 한 내용이 페이지가 캐시에서 렌더링 된 것으로 간주 되더라도 페이지에 영향을 미쳤습니다. 상단의 통지는 여전히 "캐시가 맞았다"고 말했다.

내 컨트롤러 캐시가 나에게이 준 것을 뽑아 콘솔에서 Rails.cache.read("2") 실행 :

Rails.cache.read를 호출 할 때 수동으로 쿼리를 보이지 않았다 콘솔을 통해 User.paginate 값을 캐시
User Load (0.4ms) SELECT "users".* FROM "users" ORDER BY views DESC LIMIT 5 OFFSET 0 
(0.2ms) SELECT COUNT(*) FROM "users" 
=> users freshly pulled from the database 

:

test = User.paginate(page: 1, order: "views DESC") 
=> users freshly pulled from the database 
Rails.cache.write("9", test) 
=> true 
Rails.cache.read("9") 
=> users from test; no queries displayed above this 

왜 컨트롤러 코드가 결과 대신 쿼리를 캐싱하는지 잘 모르겠습니다. 모든 조언을 크게 주시면 감사하겠습니다.

답변

0

이제 IIRC ActiveRecord가 "게으른"것이므로 쿼리 개체를 캐싱하기 만하면됩니다. User.paginate() 다음에 .all을 추가하여 sql을 강제 실행하여 캐시 할 결과 세트를 제공하십시오.

.all이 실패하면 .map/.select/.inject를 대신 사용해보십시오.

+0

감사합니다. '.all'을 사용하면 문제가 해결됩니다. ActiveRecord가 게으르다는 것을 몰랐습니다. – user1650177