2016-11-07 79 views
1

我用来摧毁删除记录远程在Heroku的轨道控制台,现在,它不会显示出来,如果我写删除记录与零号

MyModel.find_by(email: '[email protected]') 

,但如果我是不会露面写

MyModel.find_by_or_create_by(email: '[email protected]') 

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

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

+2

我觉得它的软删除了。如果试图通过包含已删除的记录范围来查找是否安装了任何软删除宝石。 –

回答

2

find_or_create_by返回一个零id的记录,那么就表明该find部分失败,然后create部分验证错误也失败了。你从MyModel.find_or_create_by(email: '[email protected]').errors.full_messages得到什么?我猜你看到了在Web控制台中看到的唯一性验证错误。

是您的应用程序使用软删除方法,例如,像宝石一样acts_as_paranoidpermanent_records?这些宝石更改destroy的行为,以便它不发出SQL DELETE命令,而是设置deleted_at列。他们还隐藏软删除的记录,所以这可能是为什么find_by没有给你任何东西。如果这是你正在做的事,你应该确保你的唯一性验证知道忽略软删除的记录。如何做到这一点取决于您的软删除实施,但您可能会发现sometipshere

您可能想直接尝试SQL以查看数据库中的真实内容,例如,使用Heroku的psql提示符或者这个Ruby代码:MyModel.unscoped.where(email: "[email protected]")

+1

是的。 acts_as_paranoid是罪魁祸首 – NothingToSeeHere

0

find_or_create_by将按给定参数查找记录,并在找不到该记录时创建该记录。如果没有id字段意味着它没有被保存并且问题已经解决。

+0

它没有解决,因为我既不能保存我找到的记录,也不能通过网络界面创建一个新记录。我在电子邮件字段中设置了唯一性验证集,并且没有ID的记录可以防止创建具有相同电子邮件的新记录。 – NothingToSeeHere