2012-06-13 3 views
4

테이블 usersscores이 있습니다.: sum을 저장하는 경우 counter_cache => true가됩니다.

belongs_to :user #score model 
has_many :scores #user model 

usersscores_count라는 열이 : 다음은 협회입니다. 이 칼럼에서 모든 값의 합을 표 scores에 저장합니다.

나는 테이블 scores의 행의 수를 절약 열 scores_count: :counter_cache => true

그러나 :counter_cache => true의 모든 scores의 합을 저장하기 위해이 방법을 사용하고 싶었다. 테이블 scores의 모든 값의 합계를 저장하는 비슷한 방법이 있습니까? 또는 나 혼자서 구현해야하는이 작업은 무엇입니까?

+0

그냥 콜백을 추가 할 수 있습니다. –

답변

4

아니요. 직접 구현해야합니다. 카운터 캐시는 연관된 레코드 수만 저장하기위한 것입니다. 연관된 User을 업데이트하려면 Score의 콜백을 사용하여 구현할 수 있습니다. 참고 : How can I cache a calculated column in rails?

또한 각 시간을 합산 할 때 눈에 띄는 성능 문제가 없으면 이와 같이 캐시를 사용하지 마십시오. 그것은 쉽게 잘못 가고 쉽게 구할 수없는 것입니다. 당신이 정말로 그것을 필요로하지 않는다면 문제의 가치가 없습니다.

+0

정보를 제공해 주셔서 감사합니다. 이 경우에는 메서드로 작업하는 것이 더 좋습니다 (** 레코드 ** 테이블에 새 레코드를 저장 한 다음 ** 점수의 모든 관련 값을 다시 계산하는 메서드를 실행합니다. ** 테이블과 금액을 ** 사용자 ** 테이블에 저장) 또는 ** 콜백 **를 통해, 위에서 언급 한 것처럼 (나는 콜백과 함께 아직 작동하지 않았다)? 더 나은/더 빠른 변종은? – user984621

+0

콜백. 레코드에 저장 액션에 대한 콜백을 설정할 수 있습니다. 대신 각 액션의 메소드를 수동으로 호출해야합니다. 콜백은 매끄럽고 오류가 발생하기 쉽습니다. –

+0

정말 감사합니다. – user984621

5

counter_culture 보석을 사용할 수 있습니다.

class Score < ActiveRecord::Base 
    belongs_to :user 
    counter_culture :user, column_name: 'scores_sum', delta_column: 'score_value' 
end