ActiveRecord 或 Postgresql 创建新记录时设置错误的 ID

ActiveRecord or Postgresql Setting Wrong ID When Creating New Record

我是 Rails 5.1,在 Heroku 免费套餐上使用 Postgresql 9.6.9。

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

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

ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "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

如果问题是因为 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