如何为一次性抽取任务重写 ruby 中的方法?

How do I override a method in ruby for a one time rake task?

我想 运行 rake 任务中的服务对象,但需要更改我的主要服务对象调用的不同服务中的方法。例如,如果我有:

main_service.rb

class MainService
  def perform
    SecondaryService.new.perform
  end
end

secondary_service.rb

class SecondaryService
  def perform
    some_method
  end

  def some_method
    puts 'something'
  end
end

并且我想将 some_method 更改为 puts 'anything',以便在 rake 任务中进行一次数据修复,我可以通过简单地重新定义方法来覆盖它吗?有没有办法限定它的范围只是耙任务?我不希望在 运行 rake 任务时意外调用此服务以防万一。我在想这样的事情:

one_time.rake

class SecondaryService
  def some_method
    puts 'anything'
  end
end

def one_time_change
  MainService.new.perform
end

您建议的代码应该可以正常工作。你可以接受那个。

但是,根据上下文,此策略可能会产生意想不到的后果 - 即,如果您不小心执行了 class 猴子修补但期望保留原始行为会发生什么?

更稳健的方法是使用依赖注入。通过这样做,您可以使用 classical 继承覆盖行为(或者甚至通过传递一个全新的对象!)。例如,类似于:

class MainService
  def perform(secondary_service: SecondaryService.new)
    secondary_service.perform
  end
end

class ModifiedSecondaryService < SecondaryService
  def some_method
    puts 'anything'
  end
end

现在,对于您的一次性佣金任务,您可以 运行:

PrimaryService.new.perform(secondary_service: ModifiedSecondaryService.new)