You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改Ruby on Rails的CriteriaCacheConcern宏以支持动态范围值

改造CriteriaCacheConcern支持动态范围值

步骤1:修改Concern宏定义,支持Proc参数

将原宏的min/max参数扩展为可接受静态值或Proc对象,在调用时动态解析值:

module CriteriaCacheConcern
  extend ActiveSupport::Concern

  class_methods do
    def cache_criteria_for(name, min:, max:)
      define_method("#{name}_cached") do
        # 解析动态值:如果是Proc就执行,否则直接用静态值
        resolved_min = min.is_a?(Proc) ? instance_exec(&min) : min
        resolved_max = max.is_a?(Proc) ? instance_exec(&max) : max

        # 缓存键加入动态值,确保值变化时缓存自动失效
        Rails.cache.fetch("#{name}_#{id}_#{resolved_min}_#{resolved_max}") do
          # 替换为你实际的断言逻辑,比如获取目标判断值
          target_value = self.score
          target_value >= resolved_min && target_value <= resolved_max
        end
      end
    end
  end
end

步骤2:在模型中传入动态计算值

直接用Proc包裹动态方法,比如将User.lowest_score_to_auto_assign作为下限传入:

class User < ApplicationRecord
  include CriteriaCacheConcern

  # 动态下限+静态上限的用法
  cache_criteria_for :auto_assign_eligible,
    min: -> { User.lowest_score_to_auto_assign },
    max: 100

  # 示例动态计算方法
  def self.lowest_score_to_auto_assign
    # 实际动态逻辑:比如从配置表取最新值
    Setting.find_by(key: "auto_assign_min_score")&.value.to_i
  end
end

关键细节

  • 若需访问当前实例的属性,可在Proc中直接写-> { self.some_instance_method },instance_exec会让Proc在实例上下文执行
  • 缓存键包含动态解析后的值,避免动态值更新时缓存不失效
  • 完全兼容原有静态值用法,比如min: 50, max: 100依然可用

内容的提问来源于stack exchange,提问作者jordan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:07:14