Rails – CSV(导出到CSV)循环

我想以(在单独的文件中)获取前50名学生和接下来的50名学生等forms(导出为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个学生获取一个单独的文件

为了回应这个问题并建立他的答案,你可以做到

 Student.all(:order => 'name').in_groups_of(50, false).each_with_index do |group,index| export_to_csv("file_number#{index}.csv", group) end 

如果您通过Web请求生成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文件

另请参阅此内容,了解如何在rails中生成csv ,如何将记录作为csv文件返回

希望这可以帮助

你可以试试

 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填充你的’groups’ – 如果最后一个组只有43个学生,包含该组的数组只有43个项目,而不是坚持一堆nil s在那里,并使它50。

我觉得应该有一个更好的方法来计算,但……

您不能使用一个请求返回多个文件,HTTP只会一次发送一个文件。 您要考虑的是将文件导出到某个安全位置,然后从那里下载(通过FTP或其他)