Ruby 更改模块中的类实例变量

Ruby 更改模块中的类实例变量,ruby,module,ruby-on-rails-5,class-variables,activesupport-concern,Ruby,Module,Ruby On Rails 5,Class Variables,Activesupport Concern,我有几个类(精灵、矮人、巨人等),我想通过一个可供使用的模块向它们添加“力量”,该模块允许我使用一个简单的DSLhas_superpower(力量名称) 每次我调用类方法has\u superpower(power\u name),它都应该在某个地方注册power\u name,这样我以后就可以获得类上所有添加的power的列表(并思考这些名称以调用其他方法) 我不知道怎么做。我看过类实例变量或类变量,但不知道如何在这个上下文中使用它们 考虑下面的样板 module Powerable mo

我有几个类(精灵、矮人、巨人等),我想通过一个可供使用的模块向它们添加“力量”,该模块允许我使用一个简单的DSL
has_superpower(力量名称)

每次我调用类方法
has\u superpower(power\u name)
,它都应该在某个地方注册
power\u name
,这样我以后就可以获得类上所有添加的power的列表(并思考这些名称以调用其他方法)

我不知道怎么做。我看过类实例变量或类变量,但不知道如何在这个上下文中使用它们

考虑下面的样板

module Powerable
  module Mongoid
    extend ActiveSupport::Concern

    def use_power!(power_name, options = {})
      send(:"last_#{power_name}_used_at=", Time.now)
      ...
      # Log the power use to the :#{power_name}_uses array
      push(#{power_name}_uses, power: power_name, time: Time.now, **options)
    end

    class_methods do
      def has_superpower(power_name)
        field :"last_#{power_name}_used_at", type: DateTime
        field :"last_#{power_name}_count", type: Integer
        field :"#{power_name}_uses", type: Array
      end
    end
end
现在,我想定义一种方法,它能让我充分利用所有的超能力。为此,我需要注册一个人拥有的权限,这样我就可以解析我需要查看的模型字段

#我将以下内容添加到上述模块Powerable::Mongoid
模块可供电
模Mongoid
def power_使用(power_名称=nil)
如果power_name.blank?#检索所有电源使用)

self.class.all_powers.flat_map do | power|u name | |#为什么不将“power uses”放在一个数组中?老实说,我完全不明白你在这里想要实现什么<代码>def使用_电源
push({power}使用
def具有{code>,
模块Elf
class Elf
def power}使用
发送(:“{power}使用”)
,…它看起来像是多个不同实现之间的一个完全混乱:S@TomLord我最初真正的问题是跟踪电子邮件活动,但为了举例说明,我认为如果我尝试描绘一个有精灵、矮人等的宇宙,我会更容易。我的想法是,我需要能够处理课堂上的一些行为这是使用模块注册的。我有一个通用模块来注册超级大国并跟踪其使用情况。除此之外,我需要提供一个不同的方法来聚合所有超级大国uses@Stefan您指的是一个
字段(:power\u uses)
,它可以跟踪每个电源(无论其类型如何?)这实际上是可行的,但我更希望在我的mongoid文档中对这些数据进行适当排序(以便于查询等),并避免在同一文档中重复。为什么不将“电源使用”放在一个数组中?老实说,我完全不明白您在这里试图实现的目标…
def use\u power!
push({power}_使用
def具有超能力
模块Elf
类Elf
def功率
self.class.所有功率
发送(:“{power}使用”)
,…它看起来像是多个不同实现之间的一个完全混乱:S@TomLord我最初真正的问题是跟踪电子邮件活动,但为了举例说明,我认为如果我尝试描绘一个有精灵、矮人等的宇宙,我会更容易。我的想法是,我需要能够处理课堂上的一些行为这是使用模块注册的。我有一个通用模块来注册超级大国并跟踪其使用情况。除此之外,我需要提供一个不同的方法来聚合所有超级大国uses@Stefan您指的是一个
字段(:power\u uses)
,它可以跟踪每个电源(无论其类型如何?)这实际上是可行的,但我希望在我的mongoid文档中对这些数据进行适当排序(以便于查询等),并避免在同一文档中重复。
module Powerable
  module Mongoid
    extend ActiveSupport::Concern

    def use_power!(power_name, options = {})
      send(:"last_#{power_name}_used_at=", Time.now)
      ...
      # Log the power use to the :#{power_name}_uses array
      push(#{power_name}_uses, power: power_name, time: Time.now, **options)
    end

    class_methods do
      def has_superpower(power_name)
        field :"last_#{power_name}_used_at", type: DateTime
        field :"last_#{power_name}_count", type: Integer
        field :"#{power_name}_uses", type: Array
      end
    end
end