2014-04-05 78 views
0

我試圖利用memoization來加速一些數據庫查詢,我遇到了用戶設置的日期參數的障礙。寫入基於params的條件變化

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已被更改,但我似乎無法弄清楚如何檢查。有沒有辦法檢查參數是否已更新,以便我可以將值重新分配給@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