我正在尝试利用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
用户将通过参数传递start_date
和end_date
。我的问题是,一旦@stats_by_user_id被这些参数设置一次,任何后续日期更改都会被忽略。
我想设置一个检查params已被更改的条件,但我似乎无法弄清楚如何检查。有没有办法检查params是否已更新,所以我可以将值重新分配给@stats_by_user_id?
答案 0 :(得分: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