gpt4 book ai didi

ruby - 如何将一个模块包含到另一个模块中(将 AASM 代码和自定义状态重构到模块中)

转载 作者:数据小太阳 更新时间:2023-10-29 06:27:02 24 4
gpt4 key购买 nike

我正在尝试重构一个 super 模型,该模型具有相当多行与状态和转换相关的 ActsAsStateMachine 代码,我希望将其重构为模块调用 CallStates。

#in lib/CallStates.rb
module CallStates
module ClassMethods
aasm_column :status
aasm_state :state1
aasm_state :state2
aasm_state :state3
end

def self.included(base)
base.send(:include, AASM)
base.extend(ClassMethods)
end
end

然后在模型中

include CallStates

我的问题涉及如何将模块行为包含到模块中,以便可以将单个模块包含到模型中。我试过 class_eval 也无济于事。感谢您对此事的任何有见地的想法。

最佳答案

您不能将一个模块完全包含在另一个模块中,但您可以告诉一个模块将其他模块包含在它所包含的类中:

module Bmodule
def greet
puts 'hello world'
end
end

module Amodule
def self.included klass
klass.class_eval do
include Bmodule
end
end
end

class MyClass
include Amodule
end

MyClass.new.greet # => hello world

最好只在 Bmodule 实际上是 Amodule 运行所必需的数据时才这样做,否则会导致混淆,因为它没有明确包含在 MyClass 中。

关于ruby - 如何将一个模块包含到另一个模块中(将 AASM 代码和自定义状态重构到模块中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4914913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com