我使用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使用相同的电子邮件创建新记录时,它会触发此虚拟记录的唯一性验证...但我无法删除重影记录。
答案 0 :(得分:2)
当find_or_create_by
返回带有id
的记录时,表示find
部分失败,然后create
部分也会因验证错误而失败。你从MyModel.find_or_create_by(email: 'some@email.com').errors.full_messages
得到了什么?我猜你看到了与你在网络控制台中看到的相同的唯一性验证错误。
您的应用是否使用了软删除方法,例如像acts_as_paranoid
或permanent_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字段表示它未被保存且问题已经解决。