无法在 rail 中导出超过 5000 行

Unable to export more than 5000 rows in rails

提问人:Carlos Morales 提问时间:11/5/2013 最后编辑:Carlos Morales 更新时间:11/13/2013 访问量:1112

问:

我做了一个应用程序来将我的所有策略导出到 excel 文件中,但没有导出我的所有信息

这是mysql中的查询

select * from policies where deleted = 0 AND (state = 0 OR state= 1) ORDER BY state ASC 
i got 11,408 total when i executed it on mysql

这是我的控制器

  @search = Policy.find_by_sql("select * from policies where deleted = 0 AND (state = 0 OR state= 1) ORDER BY state ASC ")
  @policies = @search.paginate(:page => params[:page], :per_page => 10)
  @results = @search

  respond_to do |format|
     format.html
     format.xls { send_data render_to_string(:partial=>"report"), :filename => "Report.xls" }
  end

这是我的观点

 <%= link_to "Export Excel",{:controller=>"policy",:action=>"report", :format=>"xls",:page => params[:page] }  %>

这是我的部分观点

<% @results.each do |policy| %>
     <%= policy.num_policy %> 
<% end %>

实际上只导出了 5078 行,我应该有 11,408 行

有人可以帮助我吗?

我将不胜感激

这是我的最后一条日志

 Rendered policy_management/policy/_report_by_ejecutive (42929.2ms)
 Sending data Report_2013-11-11.xls
 Completed in 43533ms (View: 0, DB: 0) | 200 OK [http://0.0.0.0/policy_management/policy/generate_print_ejecutive?format=xls]
Ruby-on-Rails 红宝石 Ruby-on-Rails-2

评论

0赞 Roman Kiselenko 11/5/2013
我记得方法包括分页[sql-limit],有一次我遇到了类似的问题。查看 sql 查询和分页。
0赞 Carlos Morales 11/5/2013
我的查询在 mysql 中工作,好吧,我放了边框 0 来检查边框是否在 5000 行上关闭但不是边框,我在 11000 行的末尾检查了它并关闭了,有什么问题似乎它有限制,有人有同样的问题?
1赞 Carlos Morales 11/5/2013
我找到了这个,但是为了 asp stackoverflow.com/questions/1403884/unable-to-export-5000-rows/......
0赞 m_x 11/9/2013
@CarlitosMorales您应该发布服务器日志。如果是超时问题,则会显示。如果生成 SQL 是 ActiveRecord 问题,它也会显示出来。超时取决于你的服务器配置,所以你不妨说出你正在使用什么环境(例如,heroku 强制执行相对较短的超时时间以鼓励使用 worker)
0赞 Carlos Morales 11/12/2013
okey我发布了我的最后一个日志

答:

3赞 Musannif Zahir 11/5/2013 #1

这可能是因为您正在对结果进行分页(这会对较大的结果集应用范围)。您可以尝试删除分页吗?

评论

0赞 Musannif Zahir 11/5/2013
@CarlitosMorales 分页不会对结果进行排序 - 它只是为每个页面提供足够的结果(这对 Web 有意义,但对 csv 导出没有意义)。排序由 SQL 处理。请在删除分页的情况下更新问题 - 可能在视图或控制器中留下了对它的引用。ORDER BY state ASC
0赞 Musannif Zahir 11/7/2013
您可以尝试从中删除吗?:page => params[:page]link_to Export Excel
2赞 UnSandpiper 11/5/2013 #2

尝试缩小问题所在。

例如,您没有提到限制是否仅在生成 Excel 格式时发生。请求 HTML 格式的页面时,您会得到多少行?

您还可以通过转到控制台并执行以下操作来检查从查询中创建了多少个对象:

@search = Policy.find_by_sql("select * from policies where deleted = 0 AND (state = 0 OR state= 1) ORDER BY state ASC ")
puts @search.count

并检查日志中它输出的数字。

接下来检查日志。它将显示实际执行的数据库查询。如果存在分页 gem 或某些配置会影响结果,则会看到实际执行的不同 sql 查询。

4赞 Chen 11/10/2013 #3

您应该使用批处理查询 ActiveRecord 批处理查询

@search = Policy.find_by_sql(“从已删除的策略中选择 * AND (状态 = 0 或状态= 1) 按状态排序 ASC ”)

@search = Policy.where("deleted = 0 AND (state = 0 OR state = 1)").order("state ASC")

在您的部分

<% @results.find_each(:batch_size => 1000) do |policy| %>
 <%= policy.num_policy %> 
<% end %>

评论

0赞 Carlos Morales 11/11/2013
我尝试了您的代码,但我使用的是 rails 2.3 编译错误 /home/carlos/proyectos/company/app/views/policy_management/policy/_report_by_ejecutive.erb:27:语法错误,意外的“:”,期望“)” [email protected]_each(batch_size: 1000) do |policy| ;@output_b......^ /home/carlos/proyectos/company/app/views/policy_management/policy/_report_by_ejecutive.erb:68:语法错误,意外的 kENSURE,预期$end
0赞 Chen 11/12/2013
哎呀,你使用的是 Ruby < 1.9 吗?那么你必须使用 :batch_size => 1000。请阅读我更新的答案
0赞 Carlos Morales 11/12/2013
我尝试了你的代码,现在我得到了#<Array:0x7f102da9b2a0>的“未定义方法'find_each'”
1赞 nickcen 11/13/2013 #4

您是否先尝试过返回 CSV 记录?我认为这可能与 Excel 导出器有关,单个 Excel 工作表中的记录数量可能有限制。

评论

0赞 Carlos Morales 11/14/2013
我没有返回 csv,但似乎这可能是导出所需的时间