【问题标题】:ActiveRecord or Postgresql Setting Wrong ID When Creating New RecordActiveRecord 或 Postgresql 在创建新记录时设置了错误的 ID
【发布时间】:2018-08-06 00:19:57
【问题描述】:

我是在 Heroku 免费层上使用 Postgresql 9.6.9 的 Rails 5.1。

我最近使用 csv 文件的 rake 任务来尝试创建几个批次或记录。然后我想测试前端的使用,并验证我的表单是否像在开发中那样工作。

但是,当我使用表单添加新记录时,我不断收到 500 错误。当我检查我的 Heroku 日志时,我收到了这个错误。

ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: 重复键值违反唯一约束“games_pkey”

它会列出它尝试使用的 id,这将是我通过 rake 任务和 csv 文件导入记录时使用的较低 id。

我通过不断尝试使用我的表单创建记录来确认这确实是问题所在,在大约 20 次尝试后终于通过了,它得到了正确的下一个 id。

我不确定这是由 Postgres 还是 Rails 引起的错误。它显然是在我开始使用 rake 任务和 csv 文件时开始的。 csv 文件确实有一个 ID 属性,用于轻松检查以更新或创建新文件,但也许这是我的原因。

任何有关如何防止此错误的建议都会很棒,因为我还以更大的批次为其他模型上传了其他 csv 文件。我想继续这样做,但前提是我可以避免这个错误,以便我可以通过我拥有的简单表格添加一两个。

感谢您的帮助。

这是可能导致问题的 rask 任务代码:

CSV.foreach(filename, {col_sep: ";", headers: true}) do |row|
  game_hash = row.to_h
  game = Game.find_by(id: game_hash["id"])

  if(!game)
    game = Game.create(game_hash)
  else
    game.update(game_hash)
  end
end

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord ruby-on-rails-5 rake-task


    【解决方案1】:

    如果问题是由于game_hash 中的id 引起的,那么我会尝试将其删除为:

    CSV.foreach(filename, {col_sep: ";", headers: true}) do |row|
      game_hash = row.to_h
      game = Game.find_by(id: game_hash["id"])
    
      #remove the id from the hash
      game_hash.delete :id
    
      if(!game)
        game = Game.create(game_hash)
      else
        game.update(game_hash)
      end
    end
    

    这应该在创建新游戏之前删除id

    【讨论】:

    • 我现在已经尝试过了。我可以确认它不起作用。我仍然有同样的问题。它似乎是 ActiveRecord 或 Postgresql 问题。我不确定是哪一个设置了 ID 或如何在幕后完成,所以不确定哪一个或两者都有问题。
    • 嗯,我不确定这里,但是否有可能因为您的钥匙没有符号化而出现这种情况?您可以尝试在第 2 行之后执行game_hash.symbolize_keys!
    • 您也必须通过game_hash[:id] 找到。
    • 做到了!通过制作按键符号,它清除了我的错误。我觉得自己像个白痴。不过,你刚刚度过了我的夜晚。非常感谢。
    • 没问题。我相信我们都去过那里:)
    猜你喜欢
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 2018-02-09
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多