0

私のRailsアプリケーションにはさまざまな書き換えが行われており、場合によっては不適切なモデル関連があります。従属レコードを検索して破棄します

現在、私のUserモデルhas_many :postsとそのdestroy方法が正しく、すべての依存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に依存関連を破壊し、コールバック

01を実行したい場合は

  • を使用して孤立した投稿を削除します。

    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

です
関連する問題