0

Über einen gewissen Zeitraum hinweg hatte meine Rails-App verschiedene Neuschreibungen und in einigen Fällen falsche Modellassoziationen.Abhängige Datensätze suchen und löschen

Derzeit mein User Modell has_many :posts und seine destroy Methode entfernt korrekt alle abhängigen Post s, aber die Zeiten an, wenn die Dinge nicht richtig geschrieben dies nicht der Fall war. Ich habe jetzt eine Handvoll Post-Einträge, die überall Fehler verursachen, weil ihr Benutzer nicht existiert.

Was wäre die effizienteste Möglichkeit, manuell alle Post-Datensätze zu filtern, zu überprüfen, ob der Benutzer tatsächlich existiert, und wenn diese Post nicht zerstört wird?

Ich stelle mir vor, so etwas wie:

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

Aber das scheint unglaublich ineffizient für Tausende von Datensätzen. Ich würde gerne den besten Weg wissen, dies zu tun. Vielen Dank!

Antwort

0

Der schnellste Weg wäre es wahrscheinlich Verzeichnis in der db-Konsole zu tun, aber wenn Sie andere abhängige Beziehungen und Active Rückrufe haben, die Sie abgefeuert erhalten müssen, könnten Sie so etwas wie tun:

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

einen Grund, warum Sie es nicht direkt in der Datenbank tun können?

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

die Waise Beiträge löschen

  • Verwendung Wenn Sie die Rückrufe

    die abhängigen Assoziationen mit Post und führen zerstören wollen
    Post.where("user_id NOT IN (?)", User.pluck(:id)).destroy_all 
    
  • Wenn Sie nur die Beiträge

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

Hier löschen wollen, ist ein guter Beitrag über finding and deleting orphan records

Verwandte Themen