【问题标题】:How to execute methods in base class when mixing in modules?混合模块时如何执行基类中的方法?
【发布时间】:2015-10-28 06:28:10
【问题描述】:

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

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 添加到工作中并在我的工作之前和之后触发一些代码。我一直在尝试理解模块是如何工作的,但是在理解事情是如何工作的方面仍然存在差距。根据我的阅读,这与我需要的相似。

任何方向表示赞赏。

【问题讨论】:

  • self.included 回调在 ruby​​ 执行 A类声明 时调用,恰好在 include B 出现的地方。 TL;DR:将include B 放在A 声明的最后。
  • @mudasobwa: 这不是 TL :)
  • 谢谢,这行得通。但是,在文件顶部包含模块更为常见。由于这种方法会使使用这个库变得更加复杂和混乱,有没有办法做到这一点,我可以在顶部包含模块?我猜不是。
  • 我只是复制并粘贴了您的代码,没有出现任何错误或任何可疑之处。要么没有问题,要么你的代码不能代表你的问题。
  • @JörgWMittag 我不确定您是否阅读了整个问题或代码,但代码本身没有错误。查看注释掉的代码,看看我想要实现的目标。

标签: ruby rails-activejob


【解决方案1】:

我看到您的问题的另外两个选项。 around_perform 是一个 ActiveJob::Base 类方法,它存储要在执行时调用的块或方法。所以你需要在类级别调用这个方法。两个选项是:

  1. 子类化:有一个基本的ActiveJob::Base 子类(例如:MainJob),它有around_perform 的东西,你所有的工作都应该子类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 在你的工作课程中

PS:我会选择#1(继承),因为它对我来说似乎更“自然”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多