2016-11-07 183 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