2012-09-17 13 views
21

Sé que esta pregunta se ha hecho mucho en este foro, pero tengo un plazo estricto y necesito ayuda, por lo que cualquier consejo es muy apreciado. Soy nuevo en Ruby on Rails, así que tenga esto en cuenta cuando responda. Quiero crear una tarea de rake que, cuando se ejecuta, actualice varias tablas en mysqlite db. Este es un archivo de migración que crea un nuevo incidente en mi db. ¿Cómo creo una tarea de rake que ingresará toda esta información a través de un archivo CSV? ¿Alguien ME PUEDE darme alguna ayuda para escribir el archivo de rake de principio a fin? Obviamente no necesitas escribir todas las tareas para cada cadena, solo dame algunos ejemplos. Y además del archivo de rake real, necesito agregar código a cualquier otra parte de mi aplicación (sé que es una pregunta muy general, pero si necesito agregar código, agradecería una descripción general de dónde). Siento que un poco de guía avanzará. Si alguien necesita más información de mí, solo pregunte.¿Cómo puedo importar un archivo CSV a través de una tarea de 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

esto es útil .... > http://stackoverflow.com/questions/3346108/how-to-write-rake-task-to-import- data-to-rails-app –

Respuesta

20

debajo de la carpeta del proyecto en lib/tarea de crear un archivo rastrillo decir "import_incidents_csv.rake"

siguen este Ruby on Rails - Import Data from a CSV file

en el archivo de código rastrillo han

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

siguiente Puede llamar a esta tarea como "rake import_incidents_csv: create_incidents"

+0

Mi problema es que no sé el código para poner en el archivo de rake que crea correctamente la nueva incidencia sin ningún error. Pero gracias por la respuesta. – RubyDude1012

+0

Tendrá que crear un archivo csv con la primera fila como nombres de columna de la tabla de incidentes. – Rubyman

+0

Este es el código que encontré en StackOverflow que he intentado adaptar a mi aplicación. Estoy teniendo problemas para conseguir que el formato de leer aunque ... lo siento desc "Una línea de descripción de la tarea" tarea: hacer import_csv requieren 'csv' csv_text = File.read ('c:/rieles/pulgar/incidents.csv ') csv = CSV.parse (csv_text,: headers => true) csv.each do | row | fila = row.to_hash.with_indifferent_access Incidents.create! (Row.to_hash.symbolize_keys) final final – RubyDude1012

2

Aquí hay un archivo CSV de ejemplo que importé usando rake db: seed. Escribí esto en el archivo seeds.rb y puse el archivo CSV en /public/seed_data/zip_code.csv. Es bastante auto explicativo (es decir, el csv tiene tres columnas: código, largo y lat

El código analiza cada línea, extrae los datos pertinentes y los asigna a una variable local y luego los escribe en un registro. ayuda

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

trabajé en esto durante horas y horas de un día, finalmente, tengo que trabajar de la siguiente manera:..

  1. añade una cabecera en la primera fila a mi archivo csv que refleja el attr_accessible en mi modelo. En mi caso, mi modelo era attr_accessible:intro, :name y en mi archivo csv el nombre de la primera línea, introducción.
  2. Creó un archivo de rake personalizado. Llamé a la mina import.rake y la puse en la carpeta lib/tasks. Coloca este código en ese archivo:
#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 

continuación, escriba bundle exec rake import en la línea de comandos.

Para que esto funcione tengo bastante navegador de base de datos SQLite. ¡Espero que ayude a alguien!

0

Puede leer su archivo csv usando el módulo CSV de rieles y puede crear registros. Aquí está la ayuda detallada: Populate db using csv

0

He usado este en el pasado. Toma cualquier tipo de modelo.

rake csv_model_import [conejitos.csv, Bunny]

Funciona como un encanto.

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

mala muestra, debido a las comas –

Cuestiones relacionadas