Ruby on rails 如何将文件名添加为数据库中的新列?
我使用RailsCast第396集导入CSV和Excel,效果非常好 现在我想添加一个新的列文件名,每行都有一个文件名。 我知道我需要用一个新的migrate创建一个新表 system.rb:Ruby on rails 如何将文件名添加为数据库中的新列?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我使用RailsCast第396集导入CSV和Excel,效果非常好 现在我想添加一个新的列文件名,每行都有一个文件名。 我知道我需要用一个新的migrate创建一个新表 system.rb: class System < ActiveRecord::Base def self.import(file) spreadsheet = open_spreadsheet(file) header = spreadsheet.row(1) (2..spreadsheet.last_
class System < ActiveRecord::Base
def self.import(file)
spreadsheet = open_spreadsheet(file)
header = spreadsheet.row(1)
(2..spreadsheet.last_row).each do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
system = find_by_id(row["id"]) || new
system.attributes = row.to_hash.slice(*System.attribute_names())
system.save!
end
end
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
when ".csv" then Roo::Csv.new(file.path.encode!("UTF-8", "Cp437"), csv_options: {col_sep: "\;"}) #, csv_options: {encoding: Encoding::ISO_8859_1})
# when ".xls" then Excel.new(file.path, nil, :ignore)
# when ".xlsx" then Excelx.new(file.path, nil, :ignore)
else raise "Unknown file type: #{file.original_filename}"
end
end
end
controller.rb:
class SystemsController < ApplicationController
before_action :set_system, only: [:show, :edit, :update, :destroy, ]
# GET /systems
# GET /systems.json
def index
@systems = System.all
db = SQLite3::Database.new './db/development.sqlite3'
@datens = db.execute 'SELECT ID1, ID2 FROM systems'
end
def import
System.import(params[:file])
redirect_to root_url, notice: "yeah"
end
index.html.erb:
<%= form_tag import_systems_path, multipart: true do %>
<%= file_field_tag :file %>
<%= %>
<%= submit_tag "read" %>
<% end %>
在self.importfile中添加这些行,假设您已经运行了迁移并添加了文件名字段。您试图实现的最终目标是什么,导致您使用这种类型的解决方案?我想在此表中加载不同的客户数据。我想用文件名来分配数据,但现在我想得很周到。为每个客户创建一个新表更好吗?谢谢Atul,但现在我得到一个TypeError,在这一行中没有将ActionDispatch::Http::UploadedFile隐式转换为字符串file\u name=file.basenamefile尝试使用file\u name=file.original\u filename
def self.import(file)
file_name = File.basename(file)
row = Hash[[header, spreadsheet.row(i)].transpose].merge({:file_name => file_name})
OR
row.to_hash.slice(*System.attribute_names()).merge({:file_name => file_name})
end