Flipper继承场景下用户标识不一致问题咨询
问题场景
主应用中存在User类,引擎MyEngine里定义了继承自User的MyEngine::User类,代码实现如下:
# 引擎中的实现代码 class MyEngine::User < User # ... end
调用flipper_id的结果显示,同一个用户的不同类实例会生成不同的ID:
User.first.flipper_id # => User;1 MyEngine::User.first.flipper_id # => MyEngine::User;1
这导致需要为每个引擎子类在Flipper中单独创建对应记录,操作繁琐。不想通过检查继承关系的分组来调用Flipper.enabled?(:something, user),希望找到更优雅的解决方案。
解决方案:统一
flipper_id生成规则 核心思路是让所有User子类实例的flipper_id和父类实例保持一致,避免因类名差异导致的重复记录。
方式1:子类单独重写
直接在引擎的MyEngine::User类中重写flipper_id方法,固定使用父类的类名生成ID:
class MyEngine::User < User def flipper_id "User;#{id}" end end
方式2:提取复用模块
如果有多个类似的引擎子类,可以把统一ID的逻辑封装成模块,方便复用:
module SharedFlipperUserId def flipper_id "#{User.name};#{id}" end end class MyEngine::User < User include SharedFlipperUserId end
方式3:父类全局统一(推荐)
在父类User中修改flipper_id的生成逻辑,让所有子类自动继承统一规则,无需逐个子类修改:
class User def flipper_id "#{self.class.base_class.name};#{id}" end end
这里self.class.base_class会返回继承链最顶层的类(即User),不管是父类还是子类实例,都会生成以User为前缀的ID,彻底解决类名差异导致的问题。
内容的提问来源于stack exchange,提问作者brcebn
相关产品推荐
相关产品推荐

