Ruby on rails 如何将文件名添加为数据库中的新列?

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_

我使用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_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