【发布时间】:2018-01-16 18:51:36
【问题描述】:
我正在尝试将 CSV 文件上传到现有数据库并收到以下内容
错误:ActiveRecord::RecordInvalid 在 UploadsController#import 中!验证失败:电子邮件已被占用。
控制器:
class UploadsController < ApplicationController
def index
@uploads = Upload.all
end
def import
Upload.import(params[:file])
redirect_to uploads_path, notice: "Employee data imported!"
end
end
型号:
class Upload < ActiveRecord::Base
require 'csv'
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
Employee.create! row.to_hash
end
end
end
表格:
create_table "employees", force: :cascade do |t|
t.string "last_name"
t.string "first_name"
t.string "employee_code"
t.string "email"
t.string "level"
t.string "dept"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
我检查并发现我的员工数据库标题与我的 CSV 文件的第一行匹配(从第 1 行开始,第 1 列)。有什么想法吗?
【问题讨论】:
-
您可以添加迁移以将新属性
last_name添加到员工表中。 -
还要仔细检查您正在运行上传的数据库是否与您手动检查列的数据库相同......即,如果您最近将该列添加到开发中并且它不在尚未生产,等等。
-
感谢@MuhamadAkbarBinWidayat。见下文。我有
last_name作为我表中的一列。除非我错过了什么不知道该怎么做。 -
@jarlyon 您是否对您的
Employee模型上的email进行了唯一性验证?它没有出现在您的帖子中,但错误是由于尝试在唯一列上插入重复值引起的。 -
感谢@DRSE。那行得通!但我真的不明白为什么我有一个空数据库。那里的电子邮件不应该是唯一的吗?
标签: ruby-on-rails database csv model-view-controller upload