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

时间:2018-08-06 00:19:57

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

我是Heroku免费版上具有Postgresql 9.6.9的Rails 5.1。

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

但是,当我使用表格添加新记录时,却不断出现500错误。当我检查Heroku日志时,出现此错误。

  

ActiveRecord :: RecordNotUnique(PG :: UniqueViolation:错误:重复的键值违反了唯一约束“ games_pkey”

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

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

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

关于如何防止此错误的任何建议都非常有用,因为我还以更大的批量上传了其他型号的其他csv文件。我想继续这样做,但前提是我必须避免出现此错误,以便在可能的情况下以我拥有的简单格式添加一两个。

谢谢您的帮助。

这是可能引起问题的复杂任务代码:

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

1 个答案:

答案 0 :(得分:0)

如果该问题是由于- kind: ExampleKind properties: - name: PropertyA direction: asc - name: PropertyB direction: asc - kind: ExampleKind properties: - name: PropertyC direction: asc - name: PropertyD direction: asc 中的id引起的,那么我将尝试将其删除为:

game_hash

这应该在创建新游戏之前删除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