1

わかりました、これを別の方法で尋ねましょう。これは、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
4

0 に答える 0