Ruby on rails 控制器对延迟作业的操作
我正在上传一个制表符分隔的文档,并在控制器中进行处理。一切正常,但在一个大文件上可能需要一些时间。我想将其移动到delay_作业,我在我的应用程序中的其他位置工作,但由于这是在控制器中,因此不能以相同的方式调用 表单调用process_file操作,而process_file操作又调用salesupload操作。我该如何将此转化为背景工作Ruby on rails 控制器对延迟作业的操作,ruby-on-rails,ruby-on-rails-3,background-process,Ruby On Rails,Ruby On Rails 3,Background Process,我正在上传一个制表符分隔的文档,并在控制器中进行处理。一切正常,但在一个大文件上可能需要一些时间。我想将其移动到delay_作业,我在我的应用程序中的其他位置工作,但由于这是在控制器中,因此不能以相同的方式调用 表单调用process_file操作,而process_file操作又调用salesupload操作。我该如何将此转化为背景工作 class SalesController < ApplicationController def salesupload(file) u
class SalesController < ApplicationController
def salesupload(file)
uploaded_io = file.read
numrows = "uploaded_io.size"
FasterCSV.parse(uploaded_io, {:headers => true, :col_sep =>"\t"}).each do |row_data|
full, upc, _discard, isrc = row_data[26].match(/^([^_]+)(_(.+))?/).to_a
new_record = AppleSale.new(
'provider' => row_data[0],
'provider_country' => row_data[1],
'vendor_identifier' => row_data[2]
)
new_record.save
end
end
def process_file
file = params[:apple_sale][:tsv_file]
salesupload(file)
end
end
class SalesControllertrue,:col\u sep=>“\t”})。每个都做|行数据|
完整,upc,_discard,isrc=行_数据[26]。将(/^([^]+)((+)?/)匹配到
new_record=AppleSale.new(
“提供程序”=>行数据[0],
“提供商所在国家”=>行数据[1],
“供应商标识”=>行数据[2]
)
new_record.save
结束
结束
def进程文件
file=params[:苹果销售][:tsv\u文件]
销售上传(文件)
结束
结束
当我不得不这样做时,我发现控制器中定义的方法必须是类方法。我不记得为什么会这样,我想这与有一个更明确的接受者有关。因此,我要做的是将salesupload方法设置为类方法,然后对其调用.delay
def self.salesupload(files)
# code
end
def process_file
file = params[:apple_sale][:tsv_file]
SalesController.delay.salesupload(file)
head :no_content
end
你应该可以走了!我还通过AJAX调用了我原来的方法(
process\u file
),然后我添加了头:no\u content
,这样它就返回了一些东西,而不需要重定向或其他任何东西。我想你应该将此代码移动到一个模型或一个单独的类(例如在lib文件夹中)。但这只是组织和最佳实践的问题
关于在后台运行此代码,您有很多选择。
如果你想使用delayed_job,我想你应该看这个视频:
但基本上,在设置了延迟作业之后,您只需使用类似send_later(:process_file)的命令在后台运行该项目。
这非常简单,您的命令和数据结构将保存在一个数据库表中,稍后一个单独的进程可以执行它。我想在看了《铁轨》之后,你会得到你的答案;) 我写了一个叫做gem的东西来做这个
在这种情况下,你会写
延迟的\u操作[:销售\u上传]
就这样