私はこの質問がこのフォーラムで多くの質問を受けたことを知っていますが、私は厳しい締め切りにあり、いくつかの助けが必要なので、アドバイスは大歓迎です。私はRuby on Railsを初めて使用するので、応答するときにそれを覚えておいてください。実行時に複数のテーブルを更新するrakeタスクを作成したいmysqlite dbにあります。これは私のdbに新しいインシデントを作成する移行ファイルです。CSVファイルを介してこのすべての情報を入力する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
lib/taskのプロジェクトフォルダーの下に、「import_incidents_csv.rake」と言うrakeファイルを作成します。
これに従って Ruby on Rails-CSVファイルからデータをインポート
レイクファイルには次のコードがあります
require 'csv'
namespace :import_incidents_csv do
task :create_incidents => :environment do
"code from the link"
end
end
このタスクは「rake import_incidents_csv:create_incidents」として呼び出すことができます
私は何時間も何時間もこれに取り組みました。次のようにして、ようやく機能しました。
attr_accessible
を反映するヘッダーを最初の行にcsvファイルに追加しました。私の場合、モデルはattr_accessible
:intro
、:name
で、csvファイルの最初の行は名前のイントロです。#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データベースブラウザーを使用しました。それが誰かを助けることを願っています!
以下は、rake db:seedを使用してインポートしたCSVの例です。これをseeds.rbファイルに書き込んで、CSVファイルを/public/seed_data/Zip_code.csvに入れました。それはかなり自明です(つまり、csvには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
私はこれを過去に使ったことがあります。あらゆるタイプのモデルをとります。
魅力のように機能します。
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
RailsのCSV
モジュールを使用してcsvファイルを読み取ることができ、レコードを作成できます。詳細なヘルプは次のとおりです csvを使用してdbを入力