Tom*_*m H 6 ruby ruby-on-rails flipper
我们正在探索使用flipper gem ( https://github.com/jnunemaker/flipper ) 来控制看到新功能的人。在我们的第一个测试中,我们希望仅向看到宣传它的横幅的前 X 个用户显示特定功能。
我们考虑使用百分比,但业务对数字非常具体,并且还希望立即达到该数字,然后为所有其他用户禁用该功能,而不是为那些首先看到它的用户禁用它。使用百分比,我们无法找到一种方法来确保正确的数字会看到它,并且第一个 x 的每个人都会看到它。
在 gates/actor.rb 里面,有这个:
enabled_actor_ids = value
Run Code Online (Sandbox Code Playgroud)
这意味着我们可以获得已启用 ID 的列表,并对其进行计数,但我们无法找到该列表是否或在哪里可能会暴露。
由于我们使用 AR 适配器作为试验,因此我们在连接到 flipper_gates 表的 actor 对象上创建了一个范围,但这感觉非常脆弱并且非常深入到 gem 的内部工作中。
任何意见是极大的赞赏。
您应该能够通过以编程方式为单个参与者打开该功能直到达到上限来实现此目的。
重要提示: 根据文档:
单个参与者门通常不是为启用数百或数千个参与者而设计的。这是一个明确的选择,可以更轻松地从适配器批量加载数据,而不是一遍又一遍地对参与者执行单独的检查。如果您需要为超过 20 人启用某些功能,我建议使用群组。
既然我们已经同意无论如何我们都想继续推进这个项目……让我们来谈谈实施吧。
您需要做的第一件事是确保参与者(可能是用户)做出响应flipper_id,并且flipper_id每个参与者的响应都是唯一的。设置完成后,当用户看到如下横幅时,您应该能够简单地为用户启用该功能:
flipper[:stats].enable_actor user
Run Code Online (Sandbox Code Playgroud)
现在,为了确定是否应该为用户启用该功能,我们需要确定有多少用户已注册该功能。
为此,我们可以直接查询 Gate:
Flipper::Adapters::ActiveRecord::Gate.where(
feature_key: "stats",
key: "actors"
).count
Run Code Online (Sandbox Code Playgroud)
这将返回参与某个功能的演员数量的计数。
好吧,让我们看看宝石。
flipper[:stats].enable_actor实际上调用Feature#enable_actor我们user之前传入的(响应flipper_id)作为参与者传入的。
接下来,Feature#enable_actor将 actor 传递到其中Types::Actor.wrap,创建一个 Types::Actor 的新实例,该实例会检查以确保 actor 不为 nil 并且它具有 Flipper_id,然后设置两个实例变量,其中一个实例变量thing设置为 actor,另一个实例变量value为设置为flipper_id演员的。
现在我们有了 的一个实例Types::Actor,我们将它传递给Feature#enable查找 ,gate在我们的例子中它将是一个Gates::Actor实例。最后我们在适配器上调用enable (在您的例子中是ActiveRecord)。
我们Adapters::ActiveRecord.enable首先看看gate.data_type在我们的例子中,是:set。从那里我们做:
@gate_class.create! do |g|
g.feature_key = feature.key
g.key = gate.key
g.value = thing.value.to_s
end
Run Code Online (Sandbox Code Playgroud)
如前所述,哪里thing.value是flipper_id. 答对了!@gate_class是负责 Gates 表的活动记录类,默认表名称是“flipper_gates”。
现在我们确切地知道要查询什么来获取参与该功能的演员的计数!
number_of_actors_enrolled_in_stats_feature = Flipper::Adapters::ActiveRecord::Gate.where(
feature_key: "stats",
key: "actors"
).count
Run Code Online (Sandbox Code Playgroud)