1

我正在尝试以最简单的方式将一些值读入 .each 代码块中的数组,但我遇到了问题。我正在通过我构建的 rake 文件导入 csv 文件,该文件将使用新行更新表,从而创建新的 id。我正在尝试获取创建的每个 id 并将它们保存到一个数组中。而且我希望能够在另一个 rake 任务中访问存储在该数组中的值。

以下代码用于将导入 csv 文件的 rake 文件,并且我希望在数组中捕获其新生成的 id。它目前做了它应该做的事情,但你一次只能导入一个新行。

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

这是另一个 rake 文件,它导入另一个 csv 文件,我需要将值存储在分配给的数组中。再说一次,如果你只导入一个新行,目前它工作得很好,但是如果你导入多行,那么一切都会变得有点混乱。

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 文件在将值读入数组时的最佳猜测。最后我有puts,所以我可以验证整数是否正确存储在数组中。一旦我让一切正常,我会删除它。

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它不会抛出异常。

您的示例中有很多冗余,已被省略。Array.new几乎不需要调用,因为就像 JavaScript 一样,您可以声明一个新数组,[ ]其中可以是空的,也可以预先填充类似[ 1 ]or的东西[ 1, 2 ]

于 2012-09-27T14:26:27.637 回答