2009-09-01 8 views
0

Je veux faire (exporter au format CSV) sous la forme d'aller chercher les 50 premiers étudiants et les 50 prochains étudiants et ainsi de suite, dans des fichiers séparés. J'ai essayé avec le code ci-dessous, et je ne sais pas comment générer une boucle, s'il vous plaît fournir du code pour faire le processus.Rails - boucle CSV (exportation vers 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 

sur l'exportation vers cliquant csv, il devrait chercher 1er 50 étudiants, 50 étudiants à venir et ainsi de suite dans des fichiers différents.

s'il vous plaît, dites comment ajouter la boucle à code ci-dessus afin qu'il va chercher tous les 50 étudiants, dans des fichiers séparés

Répondre

4

en réponse à theIV et le renforcement de sa réponse que vous pourriez faire

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

Bon appel sur 'each_with_index'! Clairement n'y pensait pas :) – theIV

1

Si vous êtes génération csv via une requête web à ma connaissance, vous ne pouvez envoyer un fichier par demande. Donc, ce que vous devez faire est de configurer votre contrôleur pour permettre la pagination. La meilleure façon de le faire est est en utilisant la pierre précieuse will_paginate (vous pouvez envoyer alternativement des fichiers multiples dans un fichier zip)

installer le plugin will_paginate http://github.com/mislav/will_paginate/tree/master

Cela vous permettra de le faire dans votre contrôleur

@students = Student.paginate :page => params[:page], :order => 'name', :per_page => 50 

donc http://localhost:3000/controller/action obtiendrait la première page avec vos 50 premiers enregistrements et http://localhost:3000/controller/action?page=2 obtiendrait également vous Shou les 50 prochaines etc.

ld recherchera probablement en utilisant des blocs de respond_to dans votre contrôleur afin qu'il sache http://localhost:3000/controller/action est un fichier html et http://localhost:3000/controller/action.csv est un fichier csv

Voir aussi cela pour une tête sur la génération csv in rails, how to return records as a csv file

espérons que cette aide

1

Vous pouvez essayer

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 vient de ActiveSupport, et le faux signifie qu'il ne sera pas pad vos « groupes » avec quelque chose comme nulle, si la dernière g Le groupe ne compte que 43 élèves, le tableau contenant ce groupe ne comportera que 43 éléments, et non pas nil s, ce qui en fait 50.

Je pense qu'il devrait y avoir une meilleure façon de faire le compte , bien que ...

1

vous ne pouvez pas retourner plusieurs fichiers avec une seule requête, HTTP n'envoie jamais un fichier à la fois. Ce que vous voudriez considérer est d'avoir les fichiers exportés vers un endroit sûr, puis de télécharger à partir de là (via FTP ou autre)