我正在在控制器中上传一个删除的文档和处理。一切正常,但是在大文件上可能需要一些时间。我想将其移至我应用程序其他地方工作的delay_job,但是由于控制器在控制器中,无法以相同的方式调用。
表格呼叫process_file操作,这又调用Salesupload操作。我应该如何将其变成后台工作?
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
我在必须这样做时发现控制器中定义的方法必须是类方法。我不记得这是为什么,我认为这与拥有更明确的接收器有关。因此,我要做的就是将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_file
),然后我附加了head :no_content
,以便它返回某些东西而无需重定向或任何内容。
我写了一个名为delayed_action的宝石。
在这种情况下,您会写
delayed_action [:sales_upload]
就是这样。
我想您应该将此代码移至模型或分开的类(例如在LIB文件夹中)。但这只是组织和最佳实践的问题。
关于在后台运行此代码,您有很多选择。如果您想使用delayed_job,我想您应该观看此屏幕截图: http://railscasts.com/episodes/171-delayed-job
但基本上,设置延迟作业后,您只使用send_later(:process_file)之类的东西来告诉在后台运行该项目。它非常简单,您的命令和数据结构将保存在数据库表中,然后分离的过程可以执行它。我想在观看铁轨之后,您将得到答案;)