在模块中混合时如何在基类中执行方法?

时间:2015-10-28 06:28:10

标签: ruby rails-activejob

我正在尝试从包含的模块中执行基类中的方法。所以,让我们说我有以下代码

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并在我的工作之前和之后触发了一些代码。我一直试图理解模块是如何工作的,但在理解工作原理方面仍然存在差距。根据我的阅读,这与我的需求类似。

任何方向赞赏。

1 个答案:

答案 0 :(得分:1)

我发现您的问题有两个其他选项。 around_perform是一个ActiveJob::Base类方法,用于存储要执行的块或方法。所以你需要在类级别调用此方法。 2个选项是:

  1. 子类化:拥有一个基础ActiveJob::Base子类(例如:MainJob),其中around_perform具有MainJob,所有作业都应该是ActiveJob::Base的子类而不是{{1} }}

  2. 在包含的块中设置around_perform回调:

  3. 在下面的例子中我使用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

    PS:我会选择#1(继承),因为它似乎更自然'给我