根据params改变写一个条件

时间:2014-04-05 03:46:59

标签: ruby-on-rails ruby params memoization

我正在尝试利用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_dateend_date。我的问题是,一旦@stats_by_user_id被这些参数设置一次,任何后续日期更改都会被忽略。

我想设置一个检查params已被更改的条件,但我似乎无法弄清楚如何检查。有没有办法检查params是否已更新,所以我可以将值重新分配给@stats_by_user_id?

1 个答案:

答案 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