我正在尝试将一些值读入一个.each do代码块中的数组,这是最简单的方法,但我遇到了问题。我正在通过我构建的rake文件导入csv文件,这将使用新行更新表,从而创建新的id。我正在尝试将每个创建的id保存到一个数组中。而且我希望能够在另一个rake任务中访问存储在该数组中的值。
以下代码用于rake文件,该文件将导入csv文件,并且我希望在数组中捕获新生成的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文件在将数值读入数组时的样子。而且我最后有了put,所以我可以验证整数是否正确存储在数组中。一旦我把一切都搞定了,我就把它删除了。
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
答案 0 :(得分: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 ]
或[ 1, 2 ]
。