2014-04-18 5 views
0

연관성에 대한 카운터 캐시를 읽었습니다.연관에없는 조건의 카운터 캐시

일부 조건에 대해 카운터 캐시를 손쉽게 구현할 수있는 방법이 있습니까? 예를 들면 :

는 일반적으로 카운터 캐시 그러나

class User 
    has_many :messages 

class Message 
    belongs_to :user, counter_cache: true 

것, 내가 얼마나 많은 메시지를 계산하지 않는 것을 말하지만,에서 모든 메시지의 문자 수를 카운트 할 수 있습니다 조

그래서 나는 사용자로부터 문자의 수를 반환하는 방법 count_chars_from(user)을 말할 수

내가 조를 여러 사람에게 메시지를 보낼 때 많은 것은 (시스템에서 발생 때 특정 열을 업데이트 할

- 모든 그 사용자는 joe가 한 사람에게 메시지를 편집 할 때 업데이트해야합니다.)

이것은 관측자들과 함께 할 수 있지만 추측할만한 코드는 매우 빨리 생성됩니다.

위와 같은 방법이 있습니까?

+0

아니요, 예를 들어'before_save'에서 직접 구현해야합니다. – mdesantis

답변

0

현재로서는 특별한 방법/도우미가 없습니다. Rails는 조건부 카운터를 지원하지 않습니다.

그러나 직접 정의 할 수 있습니다.

class Message 
    belongs_to :user 
    after_create :inc_counters 
    after_destroy :dec_counters 

    private 
    def inc_counters 
    if user && your_conditions 
     user.increment(:conditional_counter) 
    end 
    end 

    def dec_counters 
    if user && your_conditions 
     user.decrement(:conditional_counter) 
    end 
    end 
end 

counter_cache implementation을 살펴 보시기 바랍니다. 꽤 복잡해 보이지만, 간단한 구현은 프로젝트 중 하나에서 잘 작동합니다.
User 모델에서 유효성 검사 및 콜백을 트리거하지 않으려면 update_column을 사용하는 것도 고려하십시오.
연관에 따라 dependent: :destroy이 있으면 상위 모델을 삭제할 때 코드를 테스트 해보십시오.