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 !