我正在开发一个调用perform_later
个职位的产品。这适用于我们的产品生产,因为我们有一系列工人将负责所有的工作。
但是,当我在本地使用该应用时,我无法访问这些工作人员,并且我希望将所有perform_later
更改为{{1} } 仅当我在本地使用该应用程序时。
最好的方法是什么?我的一个想法是在我的perform_now
文件中添加一些内容,该内容会添加一个变量以使所有env
成为perform_later
s - 但我不确定是什么标志或类似的变量。
想法?
答案 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仅包含在
test
和development
环境中。
然后,如果你有这份工作:
/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);
简单地更新环境配置