21

この質問がこのフォーラムで多く寄せられていることは知っていますが、締め切りが厳しく、助けが必要なので、アドバイスをいただければ幸いです。Ruby on Rails は初めてなので、返信する際はその点に注意してください。実行時に mysqlite db の複数のテーブルを更新する rake タスクを作成したいと考えています。これは、データベースに新しいインシデントを作成する移行ファイルです。このすべての情報を CSV ファイル経由で入力する rake タスクを作成するにはどうすればよいですか。rake ファイルを最初から最後まで書くのを手伝ってくれませんか。明らかに、すべての文字列に対してすべてのタスクを記述する必要はありません。いくつかの例を挙げてください。そして、実際の 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
4

5 に答える 5

21

lib/task のプロジェクト フォルダーの下に、"import_incidents_csv.rake" という rake ファイルを作成します。

このRuby on Rails - Import Data from CSV file に従って ください

rakeファイルには次のコードがあります

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

このタスクを「rake import_incidents_csv:create_incidents」として呼び出すことができます

于 2012-09-17T14:25:02.710 に答える
11

私はこれに一日何時間も取り組みました。私は最終的に次のことを行うことでそれを機能させました:

  1. attr_accessibleモデルに反映された csv ファイルの最初の行にヘッダーを追加しました。私の場合、モデルはattr_accessible :intro:name、csv ファイルの最初の行は名前 intro を読みました。
  2. カスタム rake ファイルを作成しました。私は import.rake という名前を付けて、lib/tasks フォルダーに配置しました。このコードをそのファイルに配置します。
#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

次にbundle exec rake import、コマンド ラインに入力します。

これを機能させるために、私はかなりのSQLite Database Browserを持っていました。それが誰かを助けることを願っています!

于 2012-12-20T12:41:13.413 に答える
2

rake db:seed を使用してインポートした CSV の例を次に示します。これをseeds.rbファイルに書き込んで、CSVファイルを/public/seed_data/zip_code.csvに入れました。それはかなり自明です (つまり、csv には code、long、lat の 3 つの列があります)。

コードは各行を解析し、関連するデータを抽出してローカル変数に割り当て、それをレコードに書き込みます。それが役に立てば幸い。

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
于 2012-09-18T01:38:49.103 に答える
0

CSVRails のモジュールを使用して csv ファイルを読み取り、レコードを作成できます。詳細なヘルプは次のとおりです: csv を使用してデータベースにデータを入力する

于 2013-02-26T10:29:13.253 に答える
0

私は過去にこれを使用しました。どのタイプのモデルでもかまいません。

rake csv_model_import[bunnies.csv,Bunny]

魅力のように機能します。

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

于 2014-10-09T23:40:07.100 に答える