ruby on rails импортирует csv из файла загрузки в Active Records с помощью Smarter csv
Я наткнулся здесь на контрольно-пропускной пункт и мне нужна помощь. Я хочу иметь возможность импортировать CSV-файл в мою активную запись. Либо с 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 ответа
Для всех, у кого есть проблемы с этим. Вот как я это решил. Прежде всего измените CSV-файл, чтобы в качестве разделителей он был ","
Затем используйте код, который у меня есть, но измените контроллер на этот
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
и это работает
Во-первых: вы не используете 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