Qui n’a pas besoin de faire des imports csv dans sa base de donnée ???
La l’idée c’est de mettre en place un outil qui par une petite commande dans le terminal va nous importer toutes les lignes de notre fichier .csv.
#lib/tasks/import.rake require "csv" desc "Import CSV file to an active record table" task :csv_model_import, [:filename, :model] => :environment do |task, args| firstline = 0 keys = {} CSV.foreach(args[:filename]) do |row| if firstline == 0 keys = row firstline = 1 next end params = {} keys.each_with_index do |key, i| params[key] = row[i] end puts params c = Module.const_get(args[:model]).create(params) end end
Mon fichier .csv doit se trouver à la racine de mon projet.
Pour lancer l’import il me suffit de taper la commande suivante :
bundle exec rake csv_model_import[fichier_a_importer.csv,MonModel]
Attention a ne pas mettre d’espace entre le nom du ficher et celui du model !!!!!
Vous adapterez en fonction de vos besoins, si vous utilisez paperclip et que le nom des images à importer est dans votre fichier .csv vous pouvez utilisez le code suivant :
Mes champs dans le fichier .csv sont « id, nom, code, image »
require "csv" desc "Import CSV file to an active record table with images" task :csv_model_import, [:filename, :model] => :environment do |task, args| firstline = 0 keys = {} CSV.foreach(args[:filename]) do |row| if firstline == 0 keys = row firstline = 1 next end params = {} keys.each_with_index do |key, i| if key == "image" if !key.blank? params[key] = File.open('/Quel/que/soit/le/chemin/vers/le/fichier'+row[i].to_s) else end else params[key] = row[i] end end puts params c = Module.const_get(args[:model]).new do |each| each.id = params["id"] each.code = params["code"] each.nom = params["nom"] each.image = params["image"] end c.save end end
Bon c’est vrai je n’ai pas fait abstraction du contexte dans ce dernier bout de code, mais si vous avez envie de le faire, n’hésitez pas je ferais la mise à jour.
Happy coding !