2012-09-17 15 views
21

Wiem, że to pytanie zostało wiele zapytane na tym forum, ale jestem w ścisłym terminie i potrzebuję pomocy, więc wszelkie rady są bardzo cenne. Jestem nowy w Ruby on Rails, więc miej to na uwadze podczas odpowiadania. Chcę utworzyć zadanie rake, które po uruchomieniu aktualizuje wiele tabel w bazie danych mysqlite. Jest to plik migracji, który tworzy nowy incydent w mojej bazie danych. Jak utworzyć zadanie rake, które wprowadzi wszystkie te informacje za pośrednictwem pliku CSV. Czy ktoś może mi pomóc w napisaniu pliku rake od początku do końca. Oczywiście nie musisz pisać każdego zadania dla każdego ciągu, po prostu daj mi kilka przykładów. A poza faktycznym plikiem rake, muszę dodać kod do dowolnej innej części mojej aplikacji (wiem, że to bardzo ogólne pytanie, ale jeśli muszę dodać kod, byłbym wdzięczny za ogólny opis gdzie). Czuję, że trochę wskazówek pójdzie drogą. Jeśli ktoś potrzebuje więcej informacji ode mnie, proszę zapytaj.Jak mogę zaimportować plik CSV za pomocą zadania rake?

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 
+0

ten jest pomocny .... > http://stackoverflow.com/questions/3346108/how-to-write-rake-task-to-import- data-to-rails-app –

Odpowiedz

20

ramach projektu w folderze lib/zadanie utworzyć plik natarcia powiedzieć "import_incidents_csv.rake"

obserwować tą Ruby on Rails - Import Data from a CSV file

w pliku natarcia mają następujący kod

require 'csv' 
namespace :import_incidents_csv do 
    task :create_incidents => :environment do 
    "code from the link" 
    end 
end 

Możesz nazwać to zadanie jako "rake import_incidents_csv: create_incidents"

+0

Moim problemem jest to, że nie znam kodu do umieszczenia w pliku rake, który prawidłowo tworzy nowy incydent bez żadnych błędów. Ale dzięki za odpowiedź. – RubyDude1012

+0

Będziesz musiał utworzyć plik csv z pierwszym wierszem jako nazwy kolumn tabeli incydentów. – Rubyman

+0

To jest kod, który znalazłem na StackOverflow, który próbowałem dostosować do mojej aplikacji. Mam kłopot to sformatowana czytać chociaż ... przepraszam desc "Jedna linia opisu zadania" zadanie: import_csv zrobić wymagają csv csv_text = File.read ('C:/szyny/miniatury/incidents.csv ') csv = CSV.parse (csv_text,: headers => true) csv.each do | row | row = row.to_hash.with_indifferent_access Incidents.create! (Row.to_hash.symbolize_keys) koniec koniec – RubyDude1012

2

Oto przykładowy plik CSV, który zaimportowałem przy użyciu rake db: seed. Napisałem to do pliku seeds.rb i umieszczam plik CSV w /public/seed_data/zip_code.csv. Jest to dość intuicyjne (tj. Csv ma ​​trzy kolumny: kod, długi i ł.

Kod analizuje każdą linię, wyodrębnia istotne dane i przypisuje je do zmiennej lokalnej, a następnie zapisuje je do rekordu. pomaga

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 
11

pracowałem nad tym godzinami pewnego dnia wreszcie go do pracy, wykonując następujące czynności:..

  1. dodano nagłówek w pierwszym rzędzie do mojego pliku cSV, który odzwierciedla attr_accessible w moim modelu.W moim przypadku mój model był attr_accessible:intro, :name oraz w moim pliku csv - pierwsza linia przeczytana, intro.
  2. Utworzono niestandardowy plik rake. Nazwałam mój import.rake i umieściłam go w folderze lib/tasks. Umieść ten kod w tym pliku:
#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 

Następnie wpisz bundle exec rake import do linii poleceń.

Aby to działało, miałem dość SQLite Database Browser. Mam nadzieję, że komuś pomogę!

0

Użyłem tego w przeszłości. Ma dowolny model.

rake csv_model_import [bunnies.csv, Bunny]

Działa jak urok.

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

+0

Zła próbka, z powodu przecinków –

Powiązane problemy