I know this question has been asked a lot on this forum but I'm under a strict deadline and I need some help, so any advice is much appreciated. I'm new to Ruby on Rails so please keep that in mind when responding. I want to create a rake task that, when run, updates multiple tables in mysqlite db. This is a migration file that creates a new incident in my db. How do I create a rake task that will input all this info via a CSV file. Can someone PLEASE give me some help in writing the rake file from start to finish. Obviously you don't need to write every task for every string, just give me a few examples. And besides the actual rake file, do I need to add code to any other part of my app (I know thats a very general question, but if I do need to add code, I would appreciate a general description of where). I feel a little bit of guidance will go along way. If anyone needs any more information from me please just ask.
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
under your project folder in lib/task create a rake file say "import_incidents_csv.rake"
follow this Ruby on Rails - Import Data from a CSV file
in rake file have following code
require 'csv'
namespace :import_incidents_csv do
task :create_incidents => :environment do
"code from the link"
end
end
You can call this task as "rake import_incidents_csv:create_incidents"
I worked on this for hours and hours one day. I finally got it to work by doing the following:
attr_accessible
in my model. In my case my model was attr_accessible
:intro
, :name
and in my csv file the first line read name, 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
Then type bundle exec rake import
into the command line.
To get this to work I had quite SQLite Database Browser. I hope that helps someone!
Here is an example CSV that I imported using rake db:seed. I wrote this into the seeds.rb file and put the CSV file into /public/seed_data/zip_code.csv. It's pretty self explanatory (ie, the csv has three columns: code, long. and lat.
The code parses each line, extracts the pertinent data and assigns it to a local variable then writes it to a record. Hope it helps.
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
You can read your csv file using CSV
module of rails and can create records. Here is detailed help: Populate db using csv
I've used this one in the past. It takes any type of model.
Works like a charm.
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.