如何用Rails导出大型的XLS

我需要构build和导出相当复杂的XLS表。 为此,我使用RailsCast 导出CSV和Excel教程。 对于表的小样本,它的工作是完美的,但是当我试图导出大约21000个单元格的整个表时间太长了。 Heroku扔了:

应用程序错误应用程序中发生错误,您的页面无法送达。 请稍后重试。

如果您是应用程序所有者,请查看日志以获取详细信息。

但是在日志里看到花了4分多钟,但最终还是完成了:

2015-04-23T12:05:18.069312 + 00:00 heroku [router]:at = error code = H12 desc =“请求超时”
2015-04-23T12:09:14.876148 + 00:00 app [web.1]:渲染的market_prices / index.xls.erb(266788.6ms)
2015-04-23T12:09:14.876474 + 00:00 app [web.1]:266805ms完成200 OK(查看:62681.2ms | ActiveRecord:204120.4ms)

有没有办法加快进程或将任务以某种方式置于“后台”,以便在完成创build时下载文件?

这个错误似乎是因为这个任务太长了。

你应该包括一个像sidekiq , 延迟工作或Resque的后台工作。

Rails 4.2增加了Active Job ,使得包括后台工作者更容易。

这里有几个项目:

没有任何代码就很难确定问题所在。 这听起来像是一个可能的N + 1查询(你没有使用预加载和急切的加载关联),加载关联一次加载多个logging,而不是一次请求一个logging。通常当你发出请求,如果你看到一堵墙你的开发日志中有文本,你有一个n + 1的查询。子弹gem有助于这一点。

这里是一个快速教程:

http://blog.arkency.com/2013/12/rails4-preloading/

如果你有一切预加载/加载看看这个:

我会看看AXLSX Gem与crispychicken的反应,它允许您在类上创buildXLS / XLSX表的方法,甚至使它成为它自己的对象,而不是erb。 我已经做了这个案例,我需要excel。 要完成下载,用户将不得不手动执行此操作,也可以通过电子邮件将其发送给用户。 我build议通过电子邮件发送给用户,以便它不在公共文件夹中,全世界都可以看到。

如果你不想发邮件,你可以使用send_file ,它不会在你的公共文件夹中。 它会要求用户下载它。 typicall我在我的tmp目录中创build一个报告文件夹来存储这些文件,直到它们被发送下载。