2014-04-05 2 views
0

일부 데이터베이스 쿼리 속도를 높이기 위해 memoization을 사용하려고 시도 중이며 사용자가 설정 한 날짜 매개 변수로 걸려 넘어졌습니다.매개 변수 변경을 기반으로 조건부를 작성하십시오.

def self.stats_by_user_id(start_date, end_date) 
    @stats_by_user_id ||= BingRecord.select([:user_id, :stats]) 
           .where(date: start_date..end_date) 
           .where(user_id: ["9","22"]) 
           .group_by(&:user_id) 
end 

def self.get_bing_result(user_id, start_date, end_date) 
    a = stats_by_user_id(start_date, end_date)[user_id] 

    b = a.map(&:stats) 

result = b.reduce({}) do |o, hash| 
    o.merge(hash) { |_, v1, v2| v1.merge(v2) { |_, vv1, vv2| vv1 + vv2 } } 
end 
end 

사용자는 PARAMS 통해 start_dateend_date을 통과한다. 내 문제는 일단 @stats_by_user_id가 해당 매개 변수로 한 번 설정되면 새 매개 변수를 전달하는 모든 후속 날짜 변경이 무시된다는 것입니다.

params가 변경되었는지 확인하는 조건을 설정하고 싶습니다. 그러나이를 확인하는 방법을 찾을 수없는 것 같습니다. params가 업데이트되어 @stats_by_user_id에 값을 재 할당 할 수 있는지 확인하는 방법이 있습니까?

답변

1

나는 그것을 테스트하지 않았지만 이런 식으로 뭔가 :

def self.stats_by_user_id(start_date, end_date) 
    @cache ||= {} 

    @cache.fetch([start_date, end_date]) do 
    @cache[[start_date, end_date]] = BingRecord.select([:user_id, :stats]) 
               .where(date: start_date..end_date) 
               .where(user_id: ['9', '22']) 
               .group_by(&:user_id) 
    end 
end 
관련 문제