【问题标题】:write a conditional based on params change根据参数变化编写条件
【发布时间】:2014-05-17 13:36:12
【问题描述】:

我正在尝试利用记忆化来加速一些数据库查询,但我遇到了用户设置的日期参数的障碍。

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,任何后续通过新参数的日期更改都将被忽略。

我想设置一个条件来检查参数是否已更改,但我似乎不知道如何检查。有没有办法检查参数是否已更新,以便我可以将值重新分配给@stats_by_user_id?

【问题讨论】:

    标签: ruby-on-rails ruby params memoization


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 2021-11-24
      • 2018-01-20
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多