提问人:Carlos Morales 提问时间:11/5/2013 最后编辑:Carlos Morales 更新时间:11/13/2013 访问量:1112
无法在 rail 中导出超过 5000 行
Unable to export more than 5000 rows in rails
问:
我做了一个应用程序来将我的所有策略导出到 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]
答:
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,但似乎这可能是导出所需的时间
评论