我想以提取前50名学生和接下来的50名学生等形式,以单独的文件形式(导出为CSV)。 我试过下面给出的代码,我不知道如何生成循环,请提供一些代码来完成这个过程。
@count =0
if @count == 0
students = Student.find(:all,:order => 'name', :limit => 50)
@count = @count+1
else
students = Student.find(:all,:order => 'name', :limit => 50, :offset => 50)
@count = @count+1
点击导出到csv,它应该获取前50名学生,接下来的50名学生,等等在不同的文件中。
请告诉我们如何在上面的代码中添加循环,以便每隔50个学生获取一个单独的文件
答案 0 :(得分:4)
回应theIV并根据他的回答你可以做到
Student.all(:order => 'name').in_groups_of(50, false).each_with_index do |group,index|
export_to_csv("file_number#{index}.csv", group)
end
答案 1 :(得分:1)
如果您是我所知的生成csv请求,我只能根据请求发送一个文件。所以你需要做的是设置你的控制器以允许分页。最简单的方法是使用will_paginate gem(你可以选择在zip文件中发送多个文件)
安装will_paginate插件http://github.com/mislav/will_paginate/tree/master
这将允许您在控制器中执行此操作
@students = Student.paginate :page => params[:page], :order => 'name', :per_page => 50
所以http://localhost:3000/controller/action将获得包含前50条记录的第一页 并且http://localhost:3000/controller/action?page=2将获得下一个50等。
此外,您应该考虑在控制器中使用respond_to块,因此它知道http://localhost:3000/controller/action是一个html文件而http://localhost:3000/controller/action.csv是一个csv文件
另见csv generation in rails, how to return records as a csv file
希望这会有所帮助
答案 2 :(得分:1)
你可以尝试
count = 0
Student.all(:order => 'name').in_groups_of(50, false) do |group_of_students|
export_to_csv("file_number#{count}.csv", group_of_students)
count = count + 1
end
in_groups_of
来自ActiveSupport,而false表示它不会将你的'群组'填入nil等任何内容 - 如果最后一个群组只有43个学生,则包含该群组的数组只会有43个项目,而不是在那里粘贴一堆nil
并使其成为50。
我觉得应该有更好的方法来计算,但是......
答案 3 :(得分:1)
您无法通过一个请求返回多个文件,HTTP只会一次发送一个文件。您要考虑的是将文件导出到某个安全位置,然后从那里下载(通过FTP或其他)