Rails - цикл CSV (экспорт в CSV) - PullRequest
0 голосов
/ 01 сентября 2009

Я хочу сделать (экспорт в CSV) в виде выборки первых 50 студентов и следующих 50 студентов и так далее, в отдельных файлах. Я попытался с приведенным ниже кодом, и я не знаю, как создать цикл, пожалуйста, предоставьте некоторый код, чтобы сделать процесс.

 @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 ]

4 голосов
/ 01 сентября 2009

в ответ на IV и опираясь на его ответ, вы можете сделать

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 голос
/ 01 сентября 2009

Вы не можете вернуть несколько файлов одним запросом, HTTP отправляет только один файл одновременно. То, что вы хотели бы рассмотреть, это экспортировать файлы в какое-то безопасное место, а затем загружать оттуда (через FTP или что-то еще)

1 голос
/ 01 сентября 2009

Вы можете попробовать

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.

Я чувствую, что должен быть лучший способ подсчета, хотя ...

1 голос
/ 01 сентября 2009

Если вы являетесь генератором CSV через веб-запрос, насколько мне известно, вы можете отправить только один файл на запрос. Итак, что вам нужно сделать, это настроить свой контроллер, чтобы разрешить нумерацию страниц. Самый простой способ сделать это - использовать гем will_paginate (вы можете поочередно отправлять несколько файлов в виде 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 и т. д.

Также вам, вероятно, стоит подумать об использовании блоков response_to в вашем контроллере, чтобы он знал, что http://localhost:3000/controller/action - это HTML-файл, а http://localhost:3000/controller/action.csv - это CSV-файл

Также смотрите это для подробностей о генерации CSV в рельсах, как вернуть записи в виде файла CSV

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...