在rails console heroku ruby​​ postgres中删除带有nil id的记录

时间:2016-11-07 22:52:30

标签: ruby-on-rails postgresql heroku

我使用destroy在heroku rails控制台远程删除记录,现在如果我写的话就不显示

 MyModel.find_by(email: 'some@email.com')

但如果我写

,它确实会出现
MyModel.find_by_or_create_by(email: 'some@email.com')

...除了id为零。我无法弄清楚如何摆脱这个记录。我正在使用postgres和rails 4

当我尝试通过web ui使用相同的电子邮件创建新记录时,它会触发此虚拟记录的唯一性验证...但我无法删除重影记录。

2 个答案:

答案 0 :(得分:2)

find_or_create_by返回带有id的记录时,表示find部分失败,然后create部分也会因验证错误而失败。你从MyModel.find_or_create_by(email: 'some@email.com').errors.full_messages得到了什么?我猜你看到了与你在网络控制台中看到的相同的唯一性验证错误。

您的应用是否使用了软删除方法,例如像acts_as_paranoidpermanent_records这样的宝石?这些gem更改了destroy的行为,因此它不会发出SQL DELETE命令,而是设置deleted_at列。他们还隐藏了软删除的记录,这可能是find_by没有给你任何东西的原因。如果这是你正在做的,你应该确保你的唯一性验证知道忽略软删除的记录。如何执行此操作取决于您的软删除实施,但您可能会发现some tips here

您可能希望直接使用SQL查看数据库中的内容,例如:使用Heroku psql提示符或此Ruby代码:MyModel.unscoped.where(email: "some@email.com")

答案 1 :(得分:0)

find_or_create_by将按给定参数查找记录,如果找不到则创建它。如果没有id字段表示它未被保存且问题已经解决。