我正在尝试从包含的模块中执行基类中的方法。所以,让我们说我有以下代码
module B
def self.included(base)
base.extend(ClassMethods)
# code to execute A.new.my_instance_method
# code to execute A.my_static_method
end
def my_module_instance_method
puts 'module_instance_method'
end
module ClassMethods
def my_module_static_method
puts 'module_static_method'
end
end
end
class A
include B
def my_instance_method
puts 'Instance Method'
end
def self.my_static_method
puts 'static method'
end
end
我如何才能执行这两种方法?
基本上我正在尝试扩展ActiveJob,我想覆盖around_perform。我想通过混合一个模块来实现这一点,该模块为作业添加了around_perform并在我的工作之前和之后触发了一些代码。我一直试图理解模块是如何工作的,但在理解工作原理方面仍然存在差距。根据我的阅读,这与我的需求类似。
任何方向赞赏。
答案 0 :(得分:1)
我发现您的问题有两个其他选项。 around_perform
是一个ActiveJob::Base
类方法,用于存储要执行的块或方法。所以你需要在类级别调用此方法。 2个选项是:
子类化:拥有一个基础ActiveJob::Base
子类(例如:MainJob)
,其中around_perform
具有MainJob
,所有作业都应该是ActiveJob::Base
的子类而不是{{1} }}
在包含的块中设置around_perform
回调:
在下面的例子中我使用ActiveSupport::Concern
require 'active_support/concern'
module TheModule
extend ActiveSupport::Concern
included do
around_perform do |job, block|
puts "#{job.class.name} Look I'm being called"
block.call
puts "#{job.class.name} Look I was called"
end
end
end
你职业班的include TheModule