Rails - CSV(导出到CSV)循环

时间:2009-09-01 05:32:21

标签: ruby-on-rails csv

我想以提取前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个学生获取一个单独的文件

4 个答案:

答案 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或其他)