Ruby 更改模块中的类实例变量
我有几个类(精灵、矮人、巨人等),我想通过一个可供使用的模块向它们添加“力量”,该模块允许我使用一个简单的DSLRuby 更改模块中的类实例变量,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
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