【问题标题】:Can the flipper gem return a count of enabled users?鳍状肢宝石可以返回启用用户的计数吗?
【发布时间】:2017-02-21 18:29:15
【问题描述】:

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

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

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

enabled_actor_ids = value

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

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

非常感谢任何建议。

【问题讨论】:

    标签: ruby-on-rails ruby flipper


    【解决方案1】:

    现在您可以使用Flipper[:some_feature].actors_value.size,假设您已经使用Flipper.configure 配置了默认的翻转器实例。

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

    【讨论】:

      【解决方案2】:

      您应该能够以编程方式通过turning the feature on for Individual Actors 完成此操作,直到达到上限。

      重要提示: according to the documentation

      单个演员门通常不是为数百或 成千上万的演员被启用。这是一个明确的选择 更容易从适配器批量加载数据而不是执行 一遍又一遍地对演员进行个人检查。如果需要启用 超过 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_actor,而我们之前传入的user(响应flipper_id)作为actor 传入。

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

      现在我们有了Types::Actor 的实例,我们将它传递给Feature#enable,它会查找gate,在我们的例子中是Gates::Actor 实例。最后,我们在适配器(在您的情况下是 ActiveRecord)上调用 enable

      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 是负责门表的活动记录类,the default table name 是“flipper_gates”。

      现在我们确切地知道要查询哪些内容才能获得参与该功能的演员的数量!

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

      【讨论】:

      • Scott - 感谢您出色而彻底的解释!
      猜你喜欢
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 2016-05-18
      • 1970-01-01
      • 2020-08-10
      • 2016-06-04
      相关资源
      最近更新 更多