在Rails中使用Flipper能否获取功能最近变更的时间戳?
解决Flipper全局变更时间戳的方案
针对你在Rails中使用Flipper 0.28.3时需要获取全局最新变更时间(覆盖功能删除、网关移除场景)的需求,推荐通过自定义全局时间戳记录表+Flipper钩子的方式实现,具体步骤如下:
1. 创建全局时间戳模型
生成一个单例模式的ActiveRecord模型,专门记录Flipper的最新变更时间:
rails generate model FlipperGlobalTimestamp last_changed_at:datetime rails db:migrate
在模型中实现单例更新逻辑:
# app/models/flipper_global_timestamp.rb class FlipperGlobalTimestamp < ApplicationRecord # 确保全局只有一条记录,每次调用都更新时间 def self.update_timestamp! record = first_or_create record.update!(last_changed_at: Time.current) end end
2. 配置Flipper钩子绑定操作
在Flipper初始化文件中,为所有影响功能状态的操作绑定钩子,触发时间戳更新:
# config/initializers/flipper.rb Flipper.configure do |config| config.default do adapter = Flipper::Adapters::ActiveRecord.new # 绑定所有关键操作的时间戳更新逻辑 adapter.on(:add_feature) { FlipperGlobalTimestamp.update_timestamp! } adapter.on(:remove_feature) { FlipperGlobalTimestamp.update_timestamp! } adapter.on(:enable) { FlipperGlobalTimestamp.update_timestamp! } adapter.on(:disable) { FlipperGlobalTimestamp.update_timestamp! } adapter.on(:add_gate) { FlipperGlobalTimestamp.update_timestamp! } adapter.on(:remove_gate) { FlipperGlobalTimestamp.update_timestamp! } Flipper.new(adapter) end end
3. 获取全局变更时间戳
在需要生成缓存键的地方,直接读取这个时间戳:
def flipper_last_change_timestamp FlipperGlobalTimestamp.first&.last_changed_at || Time.at(0) # 初始默认值 end
4. 用于缓存键
将时间戳转为整数(避免精度问题)加入缓存键:
cache_key = ["user_dashboard", current_user.id, flipper_last_change_timestamp.to_i] cache(cache_key) do # 视图渲染逻辑 end
方案优势
- 覆盖所有关键操作:包括功能增删、开关状态变更、网关增删,完全满足你的需求
- 实现简单:基于现有ActiveRecord技术栈,无需引入额外依赖
- 性能高效:每次操作仅更新单条记录,读取时直接查询单条数据,对系统开销极小
内容的提问来源于stack exchange,提问作者AJFaraday
相关产品推荐
相关产品推荐

