6

에 대해 여러 페이지를 만료 나는 (스위퍼로,하지만 난 그 여기에 관련이없는 것 같아요) 액션 캐싱을 설정 한 내 애플 리케이션에, 그리고 지금까지 한 가지를 제외하고 잘 작동 :레일 캐싱 : 하나 개의 동작

I 페이지 매기기에 Kaminari를 사용하고, 따라서 제 작업에 expire_action을 실행하면 첫 번째 페이지 만 만료됩니다. 페이지 지정을 위해 쿼리 문자열을 사용할 때 캐싱이 작동하지 않는다는 것을 알고 있기 때문에 페이지가 URL 끝에 추가되도록 경로를 설정했습니다 (예 :/people/123/page/2).

필요한 경우이 게시물에 더 많은 정보를 추가하겠습니다.하지만 여기에 누락 된 내용이 있습니다. 누군가 내 페이지의 나머지 부분을 만료시키는 방법을 알고 있습니까?

+0

아무도 거의 다음 페이지를 볼 수 없기 때문에 색인 생성에서 첫 페이지 만 제외 할 수 있다면 똑같이 잘 될 것입니다 ... – rogerkk

답변

5

저는 여전히 원래 질문에 대한 답변에 관심이 있으며 해결책이 나오면 받아 들인 대답을 바꿀 것입니다. 즉, 페이지가 전혀 지정되지 않았는지 확인하여 원본 페이지를 캐싱하는 것으로 끝났습니다.

caches_action : index, if if => Proc.new {params [: page] .nil? }

+0

멋진 로직, 형제 – Mukesh

+0

이 경우에 대한 다른 해결책은 사용하고 있습니다. 'cache_path' 옵션 .. http://stackoverflow.com/a/2166419/1297435 –

1

나는 아직 생각하지 못했지만 동일한 문제에 직면 해있다. 실제 만기 시간을 자체 키로 캐시하십시오. 키는 "page"매개 변수없이 검색 URL의 표준 표현이됩니다. 예 :

사용자가 http://example.com?q=foo&page=3에서 검색하므로 매개 변수는 { q: 'foo', page: 3 }입니다. "page = 3"을 제거하고 {q : 'foo'}를 남겨 둡니다.

여기에 to_param을 실행하고 몇 가지 프리픽스를 추가하면 search_expiry_q=foo과 같은 캐시 키가 남습니다.

이 정규 쿼리에 대해 캐시를 조회합니다 (예 : Rails.cache.read (search_expiry_q=foo)). 존재하는 경우, 우리는 이번에 결과가 만료되도록 할 것입니다. 죄송하지만 expires_in이 아니라 expires_at이 아니므로 계산을해야합니다. 예 : expires_in: expiry_time - Time.now - 5.seconds (5 초가 경기 상황을 막기를 바랍니다). 우리는이 방법으로 전체 URL/params를 캐시합니다.

OTOH 만료가 없다면 최근에 아무도 검색을 수행하지 않았습니다. 전체 URL/PARAMS 및 expires_in 다시,

expiry_time = Time.now + 1.hour 
Rails.cache.write(`search_expiry_q=foo`, expiry_time, expires_in: 1.hour) 

을 그리고이 조각/페이지를 캐시 : 그래서 우리가 할 1.hour합니다.