わかりました、これを別の方法で尋ねましょう。これは、csv 形式でインポートするインシデント テーブルの例です。
id:
incident_datetime: 2012-09-24 08:07:00.000000+0000
location: Hamburg
report_nr: 33-11-00201
responsible_party: John
area_resident: No
street: 6108 FoxHunt
city: Lexington
state: Ky
home_phone: 111-111-1111
cell_phone: 222-222-2222
insurance_carrier_name: Nationwide
insurance_carrier_street: Waller
insurance_carrier_city: Lexington
insurance_carrier_state: KY
insurance_carrier_phone: 666-666-6666
insurance_carrier_contact: Jason
policy_nr: 2sdf2sdf
vin_nr: ZTZHK3fhr5546107407
license_nr: 520-VDH
vehicle_make: Toyota
vehicle_model: Tacoma
vehicle_year: 2004
created_at:
updated_at:
status: Recieved
user_id: 16
resp_zip: 40509
insur_zip: 40509
rakefile のコードは次のとおりです。
require 'csv'
namespace :import_incidents_csv do
task :create_incidents => :environment do
puts "Import Incidents"
csv_text = File.read('c:/rails/thumb/costrecovery_csv/lib/csv_import/incidents.csv')
csv = CSV.parse(csv_text, :headers => true)
@incident_id_array = []
csv.each do |row|
row = row.to_hash.with_indifferent_access
Incident.create!(row.to_hash.symbolize_keys)
@incident_id_array << Incident.last.id
end
end
end
上部の id には、データベースにダンプされるときに自動的に値が割り当てられます。次に、その id 値を取得して配列に保存し、タイムシートを作成します。タイムシートはこんな感じ。
id:
name:
date:
incident_id: x
created_at:
updated_at:
一連のモデルが「それに属する」ため、タイムシートを作成する必要があります。これを作成する rakefile は次のとおりです。
require 'csv'
namespace :import_timesheets_csv do
task :create_timesheets => :environment do
puts "Import Timesheets"
csv_text = File.read('c:/rails/thumb/costrecovery_csv/lib/csv_import/timesheets.csv')
csv = CSV.parse(csv_text, :headers => true)
@timesheet_id_array = []
csv.each_with_index do |row,index|
row = row.to_hash.with_indifferent_access
Timesheet.create!(row.to_hash.symbolize_keys)
@timesheet_id_array << Timesheet.last.id
timesheet = Timesheet.last
timesheet.incident_id = @incident_id_array[index]
timesheet.save
end
end
end
この時点で、新しいインシデントを作成し、作成したばかりの新しいタイムシートにリンクしています。ここで、safety_officers を作成する csv ファイルをインポートします。ファイルは次のようになります。
id:
name: Safety Officer 1
first_hour: 1
additional_hours: 2
total_hours: 3
hazmat_hours: 0.5
rate1:
rate2:
timesheet_id:
created_at:
updated_at:
そして、こちらは safety_officer.csv ファイルをインポートするためのコードです。
require 'csv'
namespace :import_safety_officers_csv do
task :create_safety_officers => :environment do
puts "Import Safety Officers"
csv_text = File.read('c:/rails/thumb/costrecovery_csv/lib/csv_import/safety_officers.csv')
csv = CSV.parse(csv_text, :headers => true)
csv.each_with_index do |row,index|
row = row.to_hash.with_indifferent_access
SafetyOfficer.create!(row.to_hash.symbolize_keys)
safety_officer = SafetyOfficer.last
safety_officer.timesheet_id = @timesheet_id_array[index]
safety_officer.save
end
end
end
上記は、1 つのインシデント レポートがインポートされ、1 つのタイムシートがインポート/作成され、1 人の安全担当者がインポートされる例です。安全担当者が自分がどのインシデントレポートに属しているかを知るために、コードをどのように変更する必要があるかを理解しようとしています。インシデントに対応する適切な timesheet_id を割り当てるにはどうすればよいですか。これを行わなければならないモデルが他にもいくつかありますが、そのうちの 1 つについて理解する必要があるだけで、残りのモデルを複製することができます。これらはすべて異なる rake ファイルとして保存され、次のような 1 つのマスター rake タスクによって実行されます。
require 'csv'
namespace :combine_csv do
task :combine => :environment do
Rake::Task["import_incidents_csv:create_incidents"].invoke
Rake::Task["import_timesheets_csv:create_timesheets"].invoke
Rake::Task["import_safety_officers_csv:create_safety_officers"].invoke
end
end