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的范围内,UX不好.其他请求将被暂停,直到提供当前请求为止.这也使我的系统挂起.因此,希望在后台进程中运行,并在用户准备好下载后让用户知道.
当我尝试移动到模型.
I get an error undefined method `send_data’ for #<\Class:0x9f8bed0>
我正在搬到模特,因为我不得不打电话给延迟工作.
第一次处理CSV和延迟作业.
编辑:ActionController :: Streaming仅在Controller中可用,所以其他方式?经常与否,这不会发生在任何地方.
正如D-Side的回答所说,我将不得不寻找其他方法.
编辑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",'etc'] sites.each do |site| csv << .... end end end def after(job) send_file( .... ) end end
如何在自定义类ExportCsv或Model中使用ActionController :: Streaming
编辑:
了解同步以及我如何处理这种情况,
答案:http://imnithin.github.io/csv_download_with_delayed_job.html
解决方法
当用户发出请求时,服务器应该做出响应以便完成填充.问题是,有些请求需要花费很多时间才能完成,用户必须坚持下去并等待它完成.一个典型案例 – 大规模的电子邮件传递,但正如您所提到的,还有其他一些,如数据套件生成.随你.完成所需的时间比用户等待的时间要长.
现在来自DelayedJob.它执行某个操作而没有要响应的查询上下文.它不需要快点.但你不能只为它拍一下send_data:它不会有任何查询要响应它.相反,它应该将完成的工作的结果写入一些持久存储.
你有很多方法可以解决这个问题.
>数据集准备就绪后,您可以通过电子邮件通知用户.您甚至可以将其附加到电子邮件中,但我不建议您:您不能依赖电子邮件提供商准备接受大量数据.建立一个链接以下载数据集并发送它.
> DelayedJob需要渲染数据集,将其保存到文件中,获取链接并通过电子邮件将其发送给用户.
>创建一个听起来像“已完成的请求”的应用程序部分(模型,控制器和视图的公司)可能是用户配置文件的一部分. “启动”请求应该指示用户稍后返回并查看该列表以获得结果.
>在满足请求后,DelayedJob必须在该列表中输入一个条目.数据集的存储方式无关紧要,但您可以将其与上述方法结合使用,将其保存到文件中并显示指向它的链接.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。