6

我们正在探索使用 Flipper gem ( https://github.com/jnunemaker/flipper ) 来控制谁看到了新功能。在我们的第一个测试中,我们希望仅向看到宣传它的横幅的前 X 个用户显示特定功能。

我们考虑使用百分比,但企业对数字非常具体,并且还希望立即达到该数字,然后为所有其他用户禁用该功能,而不是为那些首先看到它的用户禁用它。使用百分比,我们无法找到一种方法来确保正确的数字会看到它,并且第一个 x 的每个人都会看到它。

在 gates/actor.rb 里面,有这样的:

enabled_actor_ids = value

这意味着我们可以获得启用的 id 列表,并对其进行计数,但我们无法找到该列表是否或在何处可能被公开。

由于我们使用 AR 适配器作为试用版,因此我们改为在连接到 flipper_gates 表的 actor 对象上创建了一个范围,但这感觉非常脆弱,并且非常适合 gem 的内部工作。

任何意见是极大的赞赏。

4

2 回答 2

6

现在你可以做到Flipper[:some_feature].actors_value.size,假设你已经用Flipper.configure.

https://github.com/jnunemaker/flipper/blob/196946c63aee1eaa09fa25e945cdbff896fe71e5/lib/flipper/feature.rb#L258-L260

于 2018-01-19T15:07:01.757 回答
3

您应该能够通过以编程方式为单个 Actor 启用该功能来完成此操作,直到达到上限。

重要提示: 根据文档

单个参与者门通常不是为启用数百或数千个参与者而设计的。这是一个明确的选择,可以更轻松地从适配器批量加载数据,而不是一遍又一遍地对参与者执行单独的检查。如果您需要为超过 20 个人启用某项功能,我建议您使用组。

既然我们已经同意无论如何我们都想继续前进。让我们谈谈实施。

为演员启用该功能

您需要做的第一件事是确保参与者(可能是用户)做出响应,flipper_id并且flipper_id每个参与者都是唯一的。设置完成后,您应该能够在用户看到这样的横幅时简单地为他们启用该功能:

flipper[:stats].enable_actor user

计算参加功能的演员

现在,为了确定是否应该为用户启用该功能,我们需要确定有多少用户注册了该功能。

为此,我们可以直接查询 Gate:

Flipper::Adapters::ActiveRecord::Gate.where(
  feature_key: "stats",
  key: "actors"
).count

这将返回一个功能中注册的演员数量的计数。

我们怎么知道它有效?

好吧,让我们来看看宝石。

flipper[:stats].enable_actor实际上调用我们之前传入Feature#enable_actoruser(响应flipper_id)作为actor传入。

接下来,将创建一个新的 Types::Actor 实例Feature#enable_actor的 actor 传递给Types::Actor.wrap该实例,该实例检查以确保该 actor 不是 nil 并且它具有一个 Flipper_id,然后设置两个实例变量,thing这些变量设置为该 actor,value它是设置为flipper_id演员的。

现在我们有了 的实例Types::Actor,我们将它传递给Feature#enablewhich 查找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

如前所述,在哪里thing.valueflipper_id. 答对了!@gate_class是负责门表的活动记录类,默认表名是“flipper_gates”。

现在我们确切地知道要查询什么来获取参加该功能的演员的数量!

number_of_actors_enrolled_in_stats_feature = Flipper::Adapters::ActiveRecord::Gate.where(
  feature_key: "stats",
  key: "actors"
).count
于 2016-10-13T06:32:19.683 回答