Rails 5.1
我的gemfile中有以下内容
gem 'delayed_job'
gem 'delayed_job_active_record'
gem 'daemons'
我安装/更新了宝石
然后我做了:
rails generate delayed_job:active_record
这在bin中生成了两个名为delayed_jobs.rb
的文件并创建了迁移文件。
我将以下内容添加到config/application.rb
:
config.active_job.queue_adapter = :delayed_job
我有一个带有操作的控制器,它接受已经上传的csv文件,解析它,并用数据填充数据库。我希望该方法,或者特别是该方法的一部分在后台处理。
方法是:
def process_parsed_spreadsheet
temp_file_path = params[:temp_file_path]
@spreadsheet = helpers.open_worksheet(temp_file_path)
number_of_rows = @spreadsheet.count - 1
helpers.process_spreadsheet(number_of_rows, @spreadsheet, params[:followed_id])
helpers.remove_uploaded_file(temp_file_path)
redirect_to root_path, notice: t('fw_exports.file_successfully_processed')
end
我对如何使用delayed_jobs在后台处理此方法感到很遗憾。我读到了有一个模型,然后在后台使用该模型过程中的一种方法,但这是不同的。
我添加了以下内容:
应用程序/任务/ parse_and_process_spreadsheet_job.rb
class ParseAndProcessSpreadsheetJob < ApplicationJob
queue_as :default
def perform(temp_file_path, followed_id)
@spreadsheet = helpers.open_worksheet(temp_file_path)
number_of_rows = @spreadsheet.count - 1
helpers.process_spreadsheet(number_of_rows, @spreadsheet, followed_id)
helpers.remove_uploaded_file(temp_file_path)
redirect_to root_path, notice: t('fw_exports.file_successfully_processed')
end
端
我的app / controllers / fw_exports_controller.rb:
def process_parsed_spreadsheet
ParseAndProcessSpreadsheetJob.perform(params[:temp_file_path], params[:followed_id])
end
答案 0 :(得分:1)
根据the documentation,您应该可以在课程方法后添加handle_asynchronously :process_parsed_spreadsheet
。
当我使用active_job时,我通常会在app/jobs
中创建一个新文件,例如process_spreadsheet_job.rb
然后创建一个继承自ApplicationJob
的新类。这是一个最小的例子:
class ProcessSpreadsheetJob < ApplicationJob
queue_as :default
def perform(temp_file_path:)
# Your custom method here.
end
end
然后,您可以在应用程序控制器中调用ProcessSpreadsheetJob.perform_later()
并将作业添加到队列中。