2011-12-15 5 views
1

저는 다른 여러 모델의 계산 된 값 기반 데이터라는 특성을 가지고 있습니다.counter_cache와 비슷한 레일스 3에서 계산 된 속성을 어떻게 캐시 할 수 있습니까?

counter_cache과 비슷한 값을 캐싱하는 매끄러운 방법을 찾고 있지만 사용자 정의 함수를 통해 값이 자동으로 업데이트됩니다. 이미 모델에 사용자 지정 함수가 있습니다.

종속 데이터가 수정 된 경우이 함수를 호출해야합니다. 어떤 제안? 의견에 따라

답변

2

편집 :

좋아, 당신이처럼 모델과 사용자 모델을 가지고 있으므로. 무엇을 수신하는 경우,

class User < ActiveRecord::Base 
    has_many :likes 

    def calculate_popularity 
    update_attribute(:popularity, existing_function(foo)) 
    end 
end 

class Like < ActiveRecord::Base 
    belongs_to :user 

    after_create :update_user_popularity 

    def update_user_popularity 
    user.calculate_popularity 
    end 
end 

분명히 : 사용자의 방법으로 인기를 업데이트하는 기능을 넣어, 다음처럼에 after_create 또는 after_save (는 생성 후 변경할 수있는 경우) 콜백을받은 사용자를 위해 그것을 트리거합니다 좋아하는 것은 사용자 자체가 아니라 다양한 종류의 사용자 활동입니다. 좋아요에서 사용자에게 도달하기 위해 귀하의 연결을 파헤쳐 야하지만 너무 어렵지 않아야합니다.

+0

종속성을 제외한 좋은 점은 일련의 레코드를 기반으로 계산됩니다. 나는 레코드를 카운터 캐시 (counter_cache) 또는 다른 것으로 롤업하여 이것을 속일 수 있다고 생각합니다. 사이트의 모든 소셜 데이터에서 수집 한 좋아하는 것을 기반으로 얼마나 인기가 있는지 등의 점수를 계산한다고 가정 해보십시오. 그들이 새로운 것을 좋아할 때마다 점수가 올라야합니다. 필요한 것은이 데이터 콜렉션에 변경이있는 경우이 특정 오브젝트에 대해이 함수를 호출하는 것입니다. 그리고이 설명을 통해 저장이 적절하지 않은 것을 알 수 있습니다. 종속성이 올바르지 않습니다. –

+0

꽤 좋습니다. 문제를 어떻게 표현했는지 완벽하게 작동합니다. 나는 다른 사람들이 이것을 읽었을 경우에 대비하여 내가 제공 할 것이라고 생각한 한 가지 변화를 만들 예정이다. 나는 다른 사람들로부터 좋아하는 사람들이 들어올 때 우리가 경쟁 조건을 갖게 될 것이라고 생각한다. 인기가 업데이트되기 전에 첫 번째가 들어오고 두 번째 것은 들어오고 첫 번째 것은 계산하기 전에 완료됩니다. 나는 현명한 플레이가 user.popularity_is_dirty = true와 같은 것을하고 나서 점수를 사용하거나 렌더링 할 때까지 계산을 지연시키는 것이라고 생각한다. –