2011-05-02 4 views
6

이것은 까다로운 질문입니다.레일 3 : 게시 된 경우에만 counter_cache 업데이트

Article, Review 등과 같이 여러 콘텐츠 형식이있는 프로젝트가 있습니다. 각 콘텐츠 형식은 주석을 가지고 있으며 주석은 모든 콘텐츠 형식에 속할 수 있으므로 다형성을 갖습니다.

내 모든 콘텐츠 페이지에 댓글 카운터를 달아 얼마나 많은 댓글이 있는지 보여주고 카운터 캐시를 구현했습니다. (@ article.comments.count와 같은 것이 더 많은 쿼리이며, 스레드 주석에 Ancestry gem을 사용하고 있기 때문에 하위 주석은 루트 번호 만 계산되지 않습니다.

카운터 캐시 정확한 작동을 보여 주지만 항상 정확한 정보를 보여줍니다. 댓글이 항상 즉시 게시되는 것은 아니며 등록 된 사용자 만 즉시 게시 할 수 있으며이 댓글의 상태는 '2'입니다. 등록되지 않은 사용자는 중재 대기열에 들어갑니다. 이 주석은 상태가 '1'입니다.

문제는 카운터 캐시가 모두 같은 그들을 계산, 그래서 당신은 절제 한 승인 된 의견에 네 개의 의견이있는 경우, 총 수는 5

카운터에 예외를 추가하는 방법이있다,이다 comment.status가 '2'가 아닌 경우 증가하지 않도록 알려주는 캐시? 마찬가지로 백엔드에서 주석 자원을 게시하고 게시 할 주석을 설정하면 (상태 2로 지정), 관련 다형성/내용 유형 증가에 대한 카운터 캐시를 만드는 방법 (모델, 컨트롤러 또는 기타 방법)이 있습니까?

comments.rb

# Comments 
has_many :comments, :as => :commentable, :dependent => :destroy 
accepts_nested_attributes_for :comments 

article.rb

, 당신은 모델과 증가에 자신의 카운터 캐시 열을 제공 할 수 있습니다 나는 순간이다에서 생각할 수있는 어떤
belongs_to :commentable, :polymorphic => TRUE, :touch => TRUE, :counter_cache => TRUE 

답변

5

/필요에 따라 감소시킵니다. 즉

active_comments_count 
pending_comments_count 

그런 다음 모델에서, 당신은 callback 통해 update_comment_count 방법을 트리거 할 수 있습니다.

더 많은 노력이 필요하지만이 방법이 효과적 일 것이라고 확신합니다.

+0

이 문제에 대해 잠시 생각한 후에 나는 당신이 옳다고 생각합니다. 나는 한 단계 더 나아가 이것을 위해 카운터 캐싱을 포기하고 총 제출 된 의견 및 총 발행 된 의견 열을 사용합니다. 그 이유는 언젠가 공동체 평판 시스템을 구현할 계획이며 게시 된 전체 비율은 매우 유용 할 것입니다. 감사. – Shannon

+0

기꺼이 도와 드리겠습니다. –