2017-01-24 2 views
1

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?

Antwort

1

Sie müssen das Flag :delete_all nur explizit angeben, wenn Sie Ihre Verbindung mit dem Flag :nullify definieren.

class Post < ApplicationRecord 
    belongs_to :user, dependent: :nullify 
end 

Sonst :delete_all ist impliziert.

Ein weiterer wichtiger Punkt ist, dass delete_all ignoriert die Callbacks, die Sie möglicherweise definiert haben. Wenn Sie die Callbacks aufrufen möchten, müssen Sie destroy_all verwenden.

destroy_all kümmert sich nicht um die dependent Flagge.

+0

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

+1

Ihre ActiveRecord-Modelle haben möglicherweise Callbacks wie 'before_destroy'. –

Verwandte Themen