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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:52:35