Si vous souhaitez pouvoir faire quelque chose comme exporter le résultat d’une recherche d’une classe en csv avec tous les attributs de l’objet en 2 temps 3 mouvements et le faire sur différentes requêtes voici une petite astuce.
Petite info nous allons utiliser Rails5 mais cela est valable pour Rails4 à ceci prêt que la définition de la classe change un peu mais vous pouvez reprendre la méthode uniquement.
Prenez votre classe par exemple la classe MonObjet avec l’attribut titre dans le model faîtes une définition de méthode de classe comme ceci :
1 2 3 4 5 6 7 |
class MonObjet < ApplicationRecord class << self def to_csv all.map { |mo| mo.attributes.values.join(";") }.join("\r\n") end end end |
On voit ici le mot clé « all », ce mot clé indique que nous allons traiter chacun des éléments de l’activerecord et non pas forcément toutes les instances en BDD de notre model mais bien les instances de l’activerecord sur lequel nous allons appelés notre méthode « to_csv ».
Il vous suffit alors dans un controler de faire :
1 2 3 4 5 |
def export_csv csv = MonObjet.where("titre LIKE '%#{params[:titre]}%'").to_csv File.open(cheminDuFichierCSVEnAbsolu, 'w') { |file| file.write(csv) } return plain: "Fichier csv écrit" end |
Ici on effectue une requête pour retrouver les objets dont le titre contient la valeur passer en paramètre et nous appliquons la méthode « to_csv » sur les résultats de cette requête.
Voilà une méthode simple qui peut vous permettre de factoriser du code d’export csv après on peut imaginer passer en paramètres à la fonction « to_csv » la liste des attributs de l’objet à exporter ou encore des contraintes supplémentaires de transformation de format pour les dates etc….
Julien