这在我的 Controller 中工作正常。
def export_list_sites_as_csv
require "csv"
csv_string = CSV.generate do |csv|
csv << ["id","name", 'etc']
@search.relation.not_archived.each do |site|
csv << [site.id, site.name, site.etc]
end
end
send_data csv_string,
:type => 'text/csv',
:filename => '_sites.csv',
:disposition => 'attachment'
end
@search
变量取决于用户过滤器,在范围内将放置 RAM 上的大量负载 ,用户体验不好。因为其他请求将被搁置,直到当前请求得到服务。这也使我的系统挂起。因此,希望在后台进程中运行,并在准备好下载后让用户知道。当我尝试转向模型时。
I get an error undefined method `send_data' for #<\Class:0x9f8bed0>
我正在转向模型,因为我必须调用延迟工作。
第一次处理 CSV 和延迟作业。
编辑:
ActionController::Streaming
仅在 Controller 中可用,所以其他方式?更频繁与否,这不会去任何地方。如 D面回答说,我将不得不寻找其他方式。
编辑 2:关注 http://railscasts.com/episodes/171-delayed-job我能够做到
class ExportCsv < Struct(:site_ids, :user_id)
def perform
require "csv"
sites = Site.where(id: site_ids)
CSV.open("tmp/#{user_id}.csv", "w+") do |csv|
csv << ["id","name", 'etc']
sites.each do |site|
csv << ....
end
end
end
def after(job)
send_file(
....
)
end
end
使用方法
ActionController::Streaming
在自定义类中 ExportCsv
, 或 Model
编辑:
了解同步以及我如何处理这种情况,
答案 :http://imnithin.github.io/csv_download_with_delayed_job.html
最佳答案
您尝试做的事情违背了 DelayedJob 的目的。
当用户发出请求时,服务器应该做出响应以完成它。问题是,有些请求需要花费相当多的时间才能完成,用户必须等待它完成。一个经典案例 - 大量电子邮件交付,但正如您所提到的,还有其他案例,例如数据套件生成。任何。完成所需的时间比您可以让用户等待的时间更长。
现在来了 DelayedJob。它在没有查询上下文的情况下执行某个 Action 来响应。它不需要着急。但你不能只是一巴掌send_data
为它:不会有任何查询要求它回复 .相反,它应该将完成的工作的结果写入一些持久存储。
你有很多方法可以解决这个问题。
关于ruby-on-rails - 在下载大型 CSV 文件作为后台进程时排队请求(延迟作业),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27076999/