修改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
相关产品推荐
相关产品推荐

