Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby-将CSV中的条目插入数据库_Ruby On Rails_Ruby_Csv - Fatal编程技术网

Ruby on rails Ruby-将CSV中的条目插入数据库

Ruby on rails Ruby-将CSV中的条目插入数据库,ruby-on-rails,ruby,csv,Ruby On Rails,Ruby,Csv,我有一个上传的CSV文件,我这样解析: CSV.foreach(@my_file.file.path) do |row| puts row[1] end 传入的CSV文件至少包含以下列:“id”、“姓名”、“号码”、“电话”和“食品” 我想做一些类似的事情: CSV.foreach(@my_file.file.path) do |row| //find the columns in "row" associated with "id", "name", "number"

我有一个上传的CSV文件,我这样解析:

CSV.foreach(@my_file.file.path) do |row|
    puts row[1]
end
传入的CSV文件至少包含以下列:“id”、“姓名”、“号码”、“电话”和“食品”

我想做一些类似的事情:

CSV.foreach(@my_file.file.path) do |row|
     //find the columns in "row" associated with "id", "name", "number"
     //even though I don't know definitively which column they will be in
     //for example, "name" may be the 2nd or 3rd or 4th column (etc)

     //insert into my_table values(id, name, number)

end

请注意,CSV文件始终将列名作为第一行,但是不同文件的列名顺序可能不同。

如果第一行是标题名,则可以使用
:headers=>true
选项来
解析
,以便将第一行用作数据的键

text = File.read(@my_file.file.path)
csv = CSV.parse(text, :headers => true)
csv.each do |row|
  row = row.to_hash.with_indifferent_access
  YourModel.create!(row.to_hash.symbolize_keys)
end

下面是一段代码,它只将您关心的字段收集到哈希数组中:

require 'csv'

fields_to_insert = %w{ id name food number phone }
rows_to_insert = []

CSV.foreach("stuff.csv", headers: true) do |row|
  row_to_insert = row.to_hash.select { |k, v| fields_to_insert.include?(k) }
  rows_to_insert << row_to_insert
end
插入的行将包含:

[{"name"=>"Jim",
  "food"=>"pizza",
  "id"=>"123",
  "number"=>"9",
  "phone"=>"555-1212"},
 {"name"=>"Fred",
  "food"=>"sushi",
  "id"=>"55",
  "number"=>"44",
  "phone"=>"555-1213"}]
我会用它一次将它们全部插入:

SomeModel.import(rows_to_insert)
您可以在CSV循环中一次插入一条记录,但这是低效的,而且由于
id
通常是受保护的属性,因此无法对其进行批量分配,因此您必须这样做才能插入一条记录:

some_model = SomeModel.new(row_to_insert.select { |k, v| k != "id" }
some_model.id = row_to_insert["id"]
some_model.save!

…或类似的内容。

您需要CSV文件中的第一行来命名列,否则如何处理记录?第一行确实有列名,但列的顺序可能因文件而异请尝试
行到散列。值在(*字段到插入)
而不是
行到散列。选择{| k,v |字段_至_插入。包括?(k)}
some_model = SomeModel.new(row_to_insert.select { |k, v| k != "id" }
some_model.id = row_to_insert["id"]
some_model.save!