ruby-on-rails – 下载大型CSV大小文件作为后台进程的排队请求(
这在我的控制器中工作正常.
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不好.其他请求将被暂停,直到提供当前请求为止.这也使我的系统挂起.因此,希望在后台进程中运行,并在用户准备好下载后让用户知道. 当我尝试移动到模型.
我正在搬到模特,因为我不得不打电话给延迟工作. 第一次处理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的目的.
当用户发出请求时,服务器应该做出响应以便完成填充.问题是,有些请求需要花费很多时间才能完成,用户必须坚持下去并等待它完成.一个典型案例 – 大规模的电子邮件传递,但正如您所提到的,还有其他一些,如数据套件生成.随你.完成所需的时间比用户等待的时间要长. 现在来自DelayedJob.它执行某个操作而没有要响应的查询上下文.它不需要快点.但你不能只为它拍一下send_data:它不会有任何查询要响应它.相反,它应该将完成的工作的结果写入一些持久存储. 你有很多方法可以解决这个问题. >数据集准备就绪后,您可以通过电子邮件通知用户.您甚至可以将其附加到电子邮件中,但我不建议您:您不能依赖电子邮件提供商准备接受大量数据.建立一个链接以下载数据集并发送它. > DelayedJob需要渲染数据集,将其保存到文件中,获取链接并通过电子邮件将其发送给用户. >创建一个听起来像“已完成的请求”的应用程序部分(模型,控制器和视图的公司)可能是用户配置文件的一部分. “启动”请求应该指示用户稍后返回并查看该列表以获得结果. >在满足请求后,DelayedJob必须在该列表中输入一个条目.数据集的存储方式无关紧要,但您可以将其与上述方法结合使用,将其保存到文件中并显示指向它的链接. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 如何基于params [:controller]动态访问实
- Oracle PL / SQL:如何打印表类型
- xml和html是兄弟还是父子?
- flexURLRequest传中文参数到后台乱码问题解决方法
- ruby-on-rails – 将Galleria与Rails应用程序集成
- 案例学习BlazeDS+Spring之八InSync06“松耦合”UI同步事件通
- c – COM interop:如何使用ICustomMarshaler调用第三方组件
- CocoStudio使用笔记1:cocos2dx3.4加载CocoStudio导出的csb
- 在Oracle 12c中进行子选择,性能不佳
- Json.NET使用入门(二)【反序列化】