Ich möchte alle mit jedem Benutzer meiner Anwendung verknüpften Posts löschen, die einer bestimmten Bedingung entsprechen. Insbesondere möchte ich alle Beiträge, die älter als 30 Tage sind, nur löschen, wenn ein Benutzer mehr als 20 Beiträge hat. Zuerst habe ich den folgenden Code geschrieben:So löschen Sie eine Sammlung, die einer Bedingung entspricht
users = User.all
users.each do |user|
if user.posts.any? && user.posts.count > 20
user.posts.delete_all('created_at < ?', 30.days.ago)
end
end
Doch am API documentation suchen, Methode delete_all
für Sammlungen die Datensätze bedeutet nicht, werden aus der Datenbank tatsächlich entfernt, und das hängt genau auf den angegebenen Parameter, :nullify
oder :delete_all
Daher, wenn man bedenkt, dass Verfahren delete_all
für Sammlungen eines der oben genannten Parameter erfordert, würde der folgende Code korrekt sein:
users = User.all
users.each do |user|
if user.posts.any? && user.posts.count > 20
user.posts.where('created_at < ?', 30.days.ago).delete_all(:delete_all)
end
end
oder soll ich etwas anderes verwenden?
Welche Art von Rückruf kann hier beteiligt sein? Die einzigen Rückrufe, die ich verwende, sind Controller. Im Posts-Controller für die Destroy-Aktion gibt es eine before_action: correct_user-Callback. Aber mein Code ist Teil eines Hintergrundjobs, an dem kein Benutzer beteiligt ist. Ist delete_all immer noch eine gute Wahl? – Asarluhi
Ihre ActiveRecord-Modelle haben möglicherweise Callbacks wie 'before_destroy'. –