混入模块时如何执行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 个选项是:

  1. Subclassing:有一个基础 ActiveJob::Base subclass(例如:MainJob)around_perform 和你所有的工作都应该 subclass MainJob 而不是 ActiveJob::Base

  2. 在包含的块中设置 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'