2009-12-14 4 views
2

지금까지 Rails가 제공 한 놀라운 캐시 기술을 결코 들어 본 적이 없습니다. 내가 정말로 내 머리를 감쌀 수없는 한 가지는이 특별한 문제를 해결하는 방법이다.페이지 캐싱, 자동 만료/청소기에 대한 우수 사례

감안할 때 나는 많은 게시물과 블로그 모델을 가지고 :

// BlogsController 

def show 
@blog = Blog.find(params[:id) 
end 

// View 

<% @blog.posts.published.each do |p| %> 
<h2><%=h p.title %></h2> 
<%= simple_format(p.content) %> 
<% end %> 

캐시가있다 : 게시 된 게시물의 목록을 보여줍니다

class Blog < ActiveRecord::Base 
    has_many :posts 
end 

class Post < ActiveRecord::Base 
    named_scope :published, :conditions => ["published_at < ?", Time.now] 
end 

그리고 BlogsController에서 show 액션 published_at 속성에 대한 변경이 끝나면 만료됩니다. 그러나 published_at가 미래에 배치되고 그 시간에 도달하면이를 수행해야합니다.

여러분이 저에게 최선의 해결책을 제시하는 몇 가지 아이디어와 조언을 던져 주실 수 있습니까? 크론 - 직업 아니면 내 마음을 잃어?

답변

1

모두 캐시를 저장하는 데 사용하는 데이터 저장소의 종류에 따라 다릅니다.

파일 시스템을 사용하는 경우 cron 작업을 작성하여 특정 간격으로 캐시를 무효화하거나 캐시가 유효 할 때까지 캐시가 유효한 날짜 시간을 인코딩하고 모든 요청에 ​​대해 유효성을 검사하고 필요할 때 무효화 할 수 있습니다.

또는 memcached 인 경우 백엔드 인 경우 가장 좋은 해결책 인 만료 캐시를 사용할 수 있습니다.

+0

고마워, jonnii - 내가 생각했던 것 같아. –

+0

안녕하세요 @ jonnii 우리는 memcache에 페이지 캐시를 저장할 수 있습니까? 당신이 말하는 캐시 키는 무엇입니까? –

5

표시하는 코드는 레일스의 캐싱 기능을 사용하지 않습니다. 그러나 :published 명명 된 범위는 해당 코드가 처음 실행될 때 Time.now을 사용합니다 (그리고 프로덕션에서는 클래스 캐싱을 통해 기억합니다).

난 당신이 대신 원하는 의심 :

named_scope :published, lambda { { :conditions => ["published_at < ?", Time.now] } } 

람다 레일을 보장 당신의 상태마다 다시 평가합니다.

+0

예 앤디 당신은 '람다'방식에 대해 옳았습니다.하지만 어떤 코드를 사용하지 않으므로 코드는 사용하지 않습니다. 약. –