0

在一段時間內,我的Rails應用程序進行了各種重寫,並且在某些情況下不正確的模型關聯。查找並銷燬從屬記錄

目前我User模式has_many :posts及其destroy方法正確地刪除所有相關Post S,但有時當事情被不恰當地寫了這並沒有發生。我現在留下了一些Post記錄,因爲他們的用戶不存在而導致錯誤全部結束。

什麼是手動過濾所有Post記錄,檢查其用戶是否真實存在,並且如果不破壞該Post的最有效方式?

我想象的是這樣的:

Post.all.select{ |post| post.user.nil? }.destroy 

但似乎幾千年的記錄令人難以置信的效率低下。我很想知道做到這一點的最佳方法。謝謝!

回答

0

最快的方式很可能是做目錄中的DB控制檯,但如果你有其他的依賴關係,你需要解僱ActiveRecord的回調,你可以這樣做:

Post.where("id in (select p.id from posts p left outer join users u on p.user_id = u.id where u.id is null)").destroy_all 
1

爲什麼你不能直接在數據庫上做任何理由?

delete from posts where user_id not in (select id from users); 
0

使用

  • 刪除孤兒的帖子如果你想與Post破壞相關協會和運行回調

    Post.where("user_id NOT IN (?)", User.pluck(:id)).destroy_all 
    
  • 如果你只是想刪除的帖子

    Post.where("user_id NOT IN (?)", User.pluck(:id)).delete_all 
    

這裏是一個不錯的職位約finding and deleting orphan records