【问题标题】:Duplicate Records being Written to Database将重复记录写入数据库
【发布时间】:2018-09-27 17:15:14
【问题描述】:

重复记录被写入数据库的原因是什么?在我的创建操作中,我首先检查是否存在具有唯一标识符的记录,如果存在则更新它,否则会创建一个新记录。但现在在我的数据库中,我看到重复的记录不仅相隔几秒或几分钟,甚至相隔几天或几个月。这可能是什么原因造成的?

def create
  record_uid = params.delete(:uid)

  if record_uid.present?
    record = Record.find_by(uid: record_uid)

    unless record.present?
      redirect_to error_path and return
    end
  else
    record = Record.new
  end

  record.attributes = params
  record.save

  redirect_to record
end

【问题讨论】:

  • 您必须发布更多代码以供我们帮助。
  • 是代码跳过验证的一部分吗?
  • 数据库级别约束?
  • 几乎可以是任何东西。
  • 模型中没有验证或数据库中没有约束。创建操作中的创建或更新检查不应该足够吗?什么可以解释相隔几天的重复记录?

标签: ruby-on-rails database postgresql duplicates


【解决方案1】:

有几种选择:

  1. 创建数据库级 uniq 约束。这是一个可以帮助你的SO answer。根据您的代码,我建议为 uid 列创建 uniq btree 索引。
  2. 使用ActiveModel 验证创建模型级 uniq 约束:

    class Record < ActiveRecord::Base
      validates :uid, uniqueness: true
    end
    

第一个选项将引发ActiveRecord::RecordNotUnique,第二个选项record.save 将返回false,因此无论哪种方式您都需要处理

【讨论】:

  • 可以通过 GET 意外调用 create 吗?还是只能作为 POST 使用?
  • 第一个会引发ActiveRecord::RecordNotUnique,而不是简单地从save返回零。但是,是的,这是要走的路。如果您不期望有那么多重复项,您甚至可以跳过验证并只处理异常(因为无论如何您都必须处理它们)。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多