ruby on rails使用Smarter csv将csv从上传文件导入Active Records

时间:2014-11-01 13:46:03

标签: ruby-on-rails csv import rails-activerecord smartercsv

我遇到了障碍,需要帮助。我希望能够将csv文件导入我的Active Record。使用SmarterCSV或其他方式

这是我的数据库

create_table "ques", force: true do |t|
    t.integer  "rikt_nr"
    t.integer  "start_nr"
    t.integer  "end_nr"
    t.datetime "created_at"
    t.datetime "updated_at"
end

这是我的观点

<h2>Import Ques</h2>  

<%= form_tag import_ques_path, multipart: true do %>  
   <%= file_field_tag :file %>  
   <%= submit_tag "Import" %>  
<% end %> 

这是我的路线

resources :ques do  
  collection { post :import }  
end  
  root to: 'ques#index' 

和我的控制器

def import  
  Que.import(params[:file])  
   redirect_to root_url, notice: "Ques imported."  
end 

和模型

def self.import(file)  
  CSV.foreach(file.path, headers: true) do |row|  
   Que.create! row.to_hash  
  end  
end  

并且csv文件看起来像这样

Id;Rikt nr;Start nr;End nr;Created at;Updated at
1;8;4486550;4486650;October 28, 2014 08:42;October 28, 2014 08:42
2;8;4486700;4486755;October 28, 2014 08:42;October 28, 2014 08:42

我看过所有类型的指南,但我不能让它发挥作用。

2 个答案:

答案 0 :(得分:3)

首先:您不是在示例中使用smarter_csv,而是使用标准的Ruby CSV 第二:smarter_csv为您提供了指定分隔字符的选项,但不会auto detect

总之,您import应该看起来像

def self.import(file)  
  SmarterCSV.process(file.path, col_sep: ';') do |row|  
   Que.create! row 
  end  
end  

答案 1 :(得分:-1)

对于其他任何有此问题的人。这就是我解决它的方式。首先,将csv文件更改为&#34;,&#34;作为分隔符

然后使用我的代码,但将控制器更改为

def import
      csv_file = params[:file].read
      CSV.parse(csv_file) do |row|
      ques = Que.create(rikt_nr: row[0], start_nr: row[1], end_nr: row[2])
      ques.save
    end
 redirect_to ques_path, notice: "Que added"

end

并且有效