混入模块时如何执行base class中的方法?
How to execute methods in base class when mixing in modules?
我正在尝试从包含的模块中执行基础 class 中的方法。假设我有以下代码
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 添加到作业中并在我的作业前后触发一些代码。我一直试图理解模块是如何工作的,但在理解事物如何工作方面仍然存在差距。据我所读,这与我需要的相似。
任何方向表示赞赏。
对于您的问题,我看到了另外两个选项。 around_perform
是一个 ActiveJob::Base
class 方法,它存储要在执行周围调用的块或方法。所以你需要在class级别调用这个方法。 2 个选项是:
Subclassing:有一个基础 ActiveJob::Base
subclass(例如:MainJob)
有 around_perform
和你所有的工作都应该 subclass MainJob
而不是 ActiveJob::Base
在包含的块中设置 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
在你的工作中 classes
PS:我会选择#1(继承),因为它对我来说更 'natural'
我正在尝试从包含的模块中执行基础 class 中的方法。假设我有以下代码
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 添加到作业中并在我的作业前后触发一些代码。我一直试图理解模块是如何工作的,但在理解事物如何工作方面仍然存在差距。据我所读,这与我需要的相似。
任何方向表示赞赏。
对于您的问题,我看到了另外两个选项。 around_perform
是一个 ActiveJob::Base
class 方法,它存储要在执行周围调用的块或方法。所以你需要在class级别调用这个方法。 2 个选项是:
Subclassing:有一个基础
ActiveJob::Base
subclass(例如:MainJob)
有around_perform
和你所有的工作都应该 subclassMainJob
而不是ActiveJob::Base
在包含的块中设置
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
在你的工作中 classes
PS:我会选择#1(继承),因为它对我来说更 'natural'