2008-10-14 3 views
15

Ich denke, es ist wichtig ein „rückgängig machen“ Methode ala gmail zu haben, wenn Aufzeichnungen statt Anzeigen eines lästigen Popup zu zerstören, die sagt: „Bist Du sicher?“.Was ist der beste Weg, Google Mail-Stil "rückgängig machen" in Rails zu implementieren?

Die Art und Weise, die ich umgesetzt habe dies eine „deleted_at“ Timestamp-Spalte in dem Modell haben, ist die timestamped wird, wenn Methode zerstören genannt wird

def destroy 
    @foo = Foo.find(params[:id]) 
    @foo.update_attribute(:deleted_at, Time.now) 
    ... 
end 

Um revert/Undo Ich werde setzen nur die gleiche Spalte auf Null

def revert 
    @foo = Foo.find(params[:id]) 
    @foo.update_attribute(:deleted_at, nil) 
    ... 
end 

ich werde nur eine Bedingung hinzufügen müssen abzufiltrieren „gelöscht“ foos, wenn ich das find-Methode aufrufen. Vielleicht eine Cron- oder Hintergrund-Aufgabe setzen, um "gelöschte" Foos nach einiger Zeit wirklich zu zerstören.

Funktioniert für mich und einfach zu implementieren, aber ich bin neugierig, ob es eine bessere Möglichkeit gibt, diese Funktion zu implementieren? Vielleicht gibt es ein Plugin oder ein Juwel, das das bietet, von dem ich nichts weiß?

+0

Ist es dir wirklich wichtig, wenn es gelöscht wurde? Ist eine Flagge nicht ausreichend? –

+4

Ja, es ist mir egal, wann es gelöscht wurde, aber dieses Wissen könnte nützlich sein. Ich denke, Timestamps macht eine gute Flagge. – JasonOng

+1

Ich stimme der allgemeinen Stimmung zu.Ein mögliches Problem bei der Vorwegnahme solcher Bedürfnisse besteht jedoch darin, dass andere Entwickler möglicherweise dazu verleitet werden, nach dem Ort zu suchen, an dem diese (Zeitstempel-) Informationen aktuell verwendet werden. Wenn es irgendwo nicht verwendet wird, stellt es einen losen Faden dar, der für Uneingeweihte oft frustrierend und zeitraubend ist. – Magne

Antwort

4

Es gibt tatsächlich einige Plugins, die bei Agile Web Development gefunden werden können.

Hier sind die Links und Zusammenfassungen für die Plugins, die Ihre Beschreibung zu passen scheinen:

  1. Acts as Paranoid: "paranoid" Ihre Active Datensätze Stellen Wenn Sie sie löschen, wird die Zeile nicht gelöscht, sondern ein deleted_at-Feld festgelegt. Die Suche ist überlastet, um gelöschte Datensätze zu überspringen.
  2. Acts as soft deletable: Bietet die Möglichkeit, ActiveRecord-Modelle zu löschen.
+0

Scheint, dass Acts As Paranoid möglicherweise Probleme mit zukünftigen Versionen von ActiveRecord hat, da es die Find-Methode außer Kraft setzt. Acts als Soft Löschbar sieht gut aus. Ich frage mich nur, ob die deleted_table nicht mehr synchron ist, wie kann ich sie neu synchronisieren? Haben Sie schon einmal eines davon benutzt? – JasonOng

+0

Nein, aber in der Beschreibung von weichen löschbaren sagt es, dass es Helfer Methoden eingebaut hat, um sie synchron zu halten – Tilendor

+0

Eine kurze Überprüfung der beiden macht es scheint wie Acts als weich löschbar wäre die bessere Wahl, sowohl für die Methode verwendet und die Tatsache, dass es besser gepflegt scheint. –

0

Es gibt eine Datei here, die scheint zu tun, was Sie benötigen, aber ich persönlich denke, es muss etwas da draußen sein, das gelöschte Datensätze automatisch ausfiltert, es sei denn, Sie enthalten sie ausdrücklich. Auf diese Weise werden sie wirklich als gelöscht angezeigt, wenn Sie nicht einen Parameter oder einen benannten Bereich einschließen, der sie wieder enthält.

Leider habe ich keine geschrieben und die Freizeit ist begrenzt, aber es sollte nicht so schwer sein, oder?

-1

Verantwortung Kette Muster

class Action 
{ 
    Perform(context); 
    Undo(context); 
} 
+2

Dies ist sehr vage und gibt mir keine Ahnung, wie man das Rückgängig macht. Was ist der Kontext? Wie interagiert es mit der Datenbank? – Tilendor

0

Sie können die gelöschten Objekte in eine separate Sammlung bewegen (oder Tisch, oder was auch immer) - dann alles, was sehen in der ursprünglichen Liste sieht, dass es, gelöscht worden ist und Sie können beschäftigen Sie sich mit der neuen Liste, wenn es Ihnen passt.

0

PaperTrail macht dies schön. Es gibt eine gute Railscast drauf, obwohl es jetzt ein wenig alt ist. Ich weiß, dass diese Frage schon vor einiger Zeit gestellt wurde, aber ich stolperte aus Neugierde darüber und dachte, ich sollte auf einen schönen aktuellen Weg verweisen.

Verwandte Themen