Je sais que cette question a beaucoup été posée sur ce forum, mais je suis soumis à une date limite stricte et j'ai besoin d'aide, alors tout conseil est grandement apprécié. Je ne connais pas encore Ruby on Rails, alors gardez cela à l’esprit lorsque vous répondez. Je veux créer une tâche de rake qui, lorsqu'elle est exécutée, met à jour plusieurs tables dans mysqlite db. Ceci est un fichier de migration qui crée un nouvel incident dans ma base de données. Comment créer une tâche de rake qui saisira toutes ces informations via un fichier CSV. Quelqu'un peut-il s’IL VOUS PLAÎT me donner de l’aide pour l’écriture du fichier rake du début à la fin. Évidemment, vous n'avez pas besoin d'écrire chaque tâche pour chaque chaîne, donnez-moi juste quelques exemples. Et à part le fichier rake, dois-je ajouter du code à une autre partie de mon application (je sais que c'est une question très générale, mais si j'ai besoin d'ajouter du code, j'aimerais une description générale de l'endroit où). Je pense qu'un peu de guidance ira un long chemin. Si quelqu'un a besoin de plus d'informations de moi s'il vous plaît simplement demander.
class CreateIncidents < ActiveRecord::Migration
def self.up
create_table :incidents do |t|
t.datetime :incident_datetime
t.string :location
t.string :report_nr
t.string :responsible_party
t.string :area_resident
t.string :street
t.string :city
t.string :state
t.string :home_phone
t.string :cell_phone
t.string :insurance_carrier_name
t.string :insurance_carrier_street
t.string :insurance_carrier_city
t.string :insurance_carrier_state
t.string :insurance_carrier_phone
t.string :insurance_carrier_contact
t.string :policy_nr
t.string :vin_nr
t.string :license_nr
t.string :vehicle_make
t.string :vehicle_model
t.string :vehicle_year
t.timestamps
end
end
def self.down
drop_table :incidents
end
end
sous votre dossier de projet dans lib/task, créez un fichier rake avec le nom "import_incidents_csv.rake"
suivez ceci Ruby on Rails - Importer des données depuis un fichier CSV
dans le fichier rake ont le code suivant
require 'csv'
namespace :import_incidents_csv do
task :create_incidents => :environment do
"code from the link"
end
end
Vous pouvez appeler cette tâche comme "rake import_incidents_csv: create_incidents"
J'ai travaillé dessus pendant des heures et des heures un jour. Je l'ai finalement fait fonctionner en procédant comme suit:
attr_accessible
dans mon modèle. Dans mon cas, mon modèle était attr_accessible
:intro
, :name
et, dans mon fichier csv, le nom de première lecture, intro. #lib/tasks/import.rake require 'csv' desc "Imports a CSV file into an ActiveRecord table" task :import, [:filename] => :environment do CSV.foreach('myfile.csv', :headers => true) do |row| MyModel.create!(row.to_hash) end end
Ensuite, tapez bundle exec rake import
dans la ligne de commande.
Pour que cela fonctionne, j'avais SQLite Database Browser. J'espère que cela aide quelqu'un!
Voici un exemple de fichier CSV que j'ai importé à l'aide de rake db: seed. J'ai écrit ceci dans le fichier seeds.rb et ai placé le fichier CSV dans /public/seed_data/Zip_code.csv. C’est assez explicite (c.-à-d. Que le csv a trois colonnes: code, long. Et lat.
Le code analyse chaque ligne, extrait les données pertinentes et les affecte à une variable locale, puis les écrit dans un enregistrement. J'espère que ça aide.
File.open("#{Rails.root}/public/seed_data/Zip_code.csv") do |Zip_codes|
Zip_codes.read.each_line do |Zip_code|
code, longitude, latitude = Zip_code.chomp.split(",")
# to remove the quotes from the csv text:
code.gsub!(/\A"|"\Z/, '')
# to create each record in the database
ZipCodeGeo.create!(:Zip_code => code, :longitude => longitude, :latitude => latitude)
end
end
J'ai déjà utilisé celui-ci dans le passé. Il faut tout type de modèle.
Fonctionne comme un charme.
desc "Imports a CSV file into an ActiveRecord table"
task :csv_model_import, :filename, :model, :needs => :environment do |task,args|
lines = File.new(args[:filename]).readlines
header = lines.shift.strip
keys = header.split(',')
lines.each do |line|
params = {}
values = line.strip.split(',')
keys.each_with_index do |key,i|
params[key] = values[i]
end
Module.const_get(args[:model]).create(params)
end
end
Vous pouvez lire votre fichier csv en utilisant le module CSV
de Rails et créer des enregistrements. Voici une aide détaillée: Remplir la base de données avec csv