1

いくつかの値を .each do コード ブロックの配列にできるだけ簡単な方法で読み取ろうとしていますが、問題が発生しています。作成したrakeファイルを介してcsvファイルをインポートしています。これにより、テーブルが新しい行で更新され、新しいIDが作成されます。作成された各IDを取得して配列に保存しようとしています。そして、別の rake タスクでその配列に格納されている値にアクセスできるようにしたいと考えています。

次のコードは、csv ファイルをインポートする rake ファイルと、新しく生成された ID を配列にキャプチャするためのものです。現在、本来の機能を果たしていますが、一度に 1 つの新しい行しかインポートできません。

Import_incidents_csv.rake

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)
    csv.each do |row|
        row = row.to_hash.with_indifferent_access
        Incident.create!(row.to_hash.symbolize_keys)
    end

    @last_incident_id = Incident.last.id

    end
  end

これは、割り当てられた配列に値を格納する必要がある別の csv ファイルをインポートする別の rake ファイルです。繰り返しますが、現在、1 つの新しい行をインポートするだけで問題なく動作しますが、複数の行をインポートすると、すべてが少し面倒になります。

Import_timesheets_csv.rake

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)
    csv.each do |row|
        row = row.to_hash.with_indifferent_access
        Timesheet.create!(row.to_hash.symbolize_keys)
    end

    timesheet = Timesheet.last
    timesheet.incident_id = @last_incident_id
    timesheet.save

    @last_timesheet_id = Timesheet.last.id

     end
end

配列を扱うためのこのリソースhttp://www.tutorialspoint.com/ruby/ruby_arrays.htmを読みましたが、非常に混乱しているようです。値を配列に読み込むと、Import_incidents_csv.rake ファイルがどのように見えるかについての私の最善の推測を次に示します。最後にプットがあるので、整数が配列に適切に格納されていることを確認できます。すべてが機能するようになったら、削除します。

require 'csv'

def inc_id
@inc_id = Incident.last.id
end

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)
    csv.each do |row|
        row = row.to_hash.with_indifferent_access
        Incident.create!(row.to_hash.symbolize_keys)
        Incident.last.id = @inc_id
        id_array = Array.new(@inc_id)
    end

    puts "#{id_array}"

      end
  end
4

1 に答える 1

2

ここで何をしようとしているのかわかりません。質問は明確ではありませんがid、挿入されたレコードの値を配列に収集しようとしている可能性があります。

id_array = [ ]

csv.each do |row|
  incident = Incident.create!(row.to_hash.symbolize_keys)
  id_array << incident.id
end

これが完了id_arrayすると、作成されたすべてのレコードid値が含まれます。注意として、これらのcreate!呼び出しのいずれかが失敗すると、ActiveRecord::RecordInvalid何らかの方法でレスキューして処理する必要がある例外が発生します。Indcident.transaction do ... endそのため、データベースがトランザクションをサポートしていると仮定して、この操作全体を の中にラップして、失敗した場合に全体をロールバックできるようにすることは理にかなっています。失敗を気にしない場合は、create例外をスローしない代わりに呼び出すことができます。

あなたの例には多くの冗長性があり、省略されています。JavaScript のように、新しい配列を空にするか、または などを事前に入力して宣言Array.newできるため、呼び出しはほとんど必要ありません。[ ][ 1 ][ 1, 2 ]

于 2012-09-27T14:26:27.637 に答える