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

所以此时,我创建了一个新事件,它链接到我刚刚创建的新时间表。现在我想导入一个创建安全官员的 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。我还有其他几个模型,我也必须这样做,但我只需要为其中一个找出它,然后我可以为其余的复制它。所有这些都保存为不同的 rake 文件,并由一个看起来像这样的主 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