【发布时间】:2018-02-22 01:14:53
【问题描述】:
我有一个有效的导入器功能。问题是如果记录已经在表中,它会创建一个重复项。表中只有一个名为 mtype 的字段。所以 CSV 文件看起来像
mtype
HP360
Dell
正在工作的导入:
require 'csv'
class Modeltype < ApplicationRecord
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
Modeltype.create! row.to_hash
end
end
end
我试图通过以下方式搜索记录是否在数据库中:
require 'csv'
class Modeltype < ApplicationRecord
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
tag = row.to_hash
if Modeltype.find_by_mtype(tag) == nil
Modeltype.create! row.to_hash
end
end
end
end
当我这样运行它时,它会返回“无法投射哈希错误”。
在控制器中我有:
def import
Modeltype.import(params[:file])
redirect_to modeltypes_url, notice: "Model Types imported."
end
如何搜索以查看记录是否已存在?如果它不存在则创建它,如果它存在则跳过该行?我也尝试使用标志 validates_presence_of,但这也没有用。
我似乎记得以前在另一个项目上使用过 validates_uniquness_of,这可能有用吗?
【问题讨论】:
-
具体是什么问题?
find_by_mtype并给它一个哈希值找不到行? -
将它抛出的错误添加到描述中,但它说不能投射哈希。
-
那个字段是什么?有什么连载的吗? (如果它是一个大表,并且没有索引,这将是一个烦人的表扫描。)
-
表中只有一个字段叫mtype。有更好的方法吗?比如设置模型来验证唯一性?
-
那个字段是什么?序列化的东西?