【问题标题】:How to verify record does not exist in database prior to import?导入前如何验证数据库中不存在记录?
【发布时间】: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。有更好的方法吗?比如设置模型来验证唯一性?
  • 那个字段是什么?序列化的东西?

标签: sqlite ruby-on-rails-5


【解决方案1】:

在你的 modeltype.rb 文件中,在你的 def 之外添加一行 Modeltype validates_uniqueness_of :mtype。如果项目不在数据库中,这将允许导入工作。如果在导入期间存在记录,您仍需要构建一个 catch 以跳过。否则你会得到一个错误。因此,添加了该行的原始 def 如下所示:

require 'csv'
class Modeltype < ApplicationRecord
  validates_uniqueness_of :mtype
  def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|
      Modeltype.create! row.to_hash
    end
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多