如何将我的所有“perform_later”转换为“在本地执行?”?

时间:2016-07-06 20:27:42

标签: ruby-on-rails environment-variables jobs

我正在开发一个调用perform_later个职位的产品。这适用于我们的产品生产,因为我们有一系列工人将负责所有的工作。

但是,当我在本地使用该应用时,我无法访问这些工作人员,并且我希望将所有perform_later更改为{{1} } 仅当我在本地使用该应用程序时。

最好的方法是什么?我的一个想法是在我的perform_now文件中添加一些内容,该内容会添加一个变量以使所有env成为perform_later s - 但我不确定是什么标志或类似的变量。

想法?

3 个答案:

答案 0 :(得分:8)

干净的解决方案是开发环境中的change the adapter

/config/environments/development.rb 中,您需要添加:

Rails.application.configure do
  config.active_job.queue_adapter = :inline
end
  

“使用Inline适配器将作业排队时,作业将立即执行。”

答案 1 :(得分:5)

在您的应用中,您可以:

/my_app/config/initializers/jobs_initializer.rb

module JobsExt
  extend ActiveSupport::Concern

  class_methods do
    def perform_later(*args)
      puts "I'm on #{Rails.env} envirnoment. So, I'll run right now"
      perform_now(*args)
    end
  end
end

if Rails.env != "production"
  puts "including mixin"
  ActiveJob::Base.send(:include, JobsExt)
end
  

此mixin仅包含在testdevelopment环境中。

然后,如果你有这份工作:

/my_app/app/jobs/my_job.rb

class MyJob < ActiveJob::Base
  def perform(param)
    "I'm a #{param}!"
  end
end

您可以执行:

MyJob.perform_later("job")

得到:

#=> "I'm a job!"

而不是作业实例:

#<MyJob:0x007ff197cd1938 @arguments=["job"], @job_id="aab4dbfb-3d57-4f6d-8994-065a178dc09a", @queue_name="default">
  

请记住:执行此操作,所有您的作业将立即在测试和开发环境中执行。如果要为单个作业启用此功能,则只需在该作业中包含JobsExt mixin。

答案 2 :(得分:2)

我们通过调用一个中间方法来解决这个问题,然后根据Rails配置调用perform_later或perform_now:

for ($i = 0; $i < sizeof($guide_info); $i++) {
     //..other stuff
     $guide_info_new = array ( 'guide_name' => $guide_name, 'guide_description' => $guide_description);
     array_push($options, $guide_info_new);
}
update_option( 'assist', $options);

简单地更新环境配置