0

Ich versuche, ein bestimmtes Benutzerkonto als "sandboxed" festzulegen, was bedeutet, dass ich alle Datenbankänderungen rückgängig machen möchte, die der Benutzer bei der Vernichtung seiner Sitzung vornimmt.Wie würden Sie in Rails 4 alle für einen Benutzer spezifischen Datenbankänderungen protokollieren und rückgängig machen?

Ich habe mich mit dem Paper Trail-Juwel angeschaut, aber ich bin mir nicht sicher, ob es verwendet werden kann, um für einen Benutzer spezifische Änderungen rückgängig zu machen.

Ist das möglich?

+1

Sie meinen, entfernen Sie alle ihre Aufzeichnungen darüber? Oder manipulieren sie das Schema? –

+0

Klingt so, als ob Sie nur einen Standard für einen Sandbox-Benutzer benötigen und Sie setzen ihre Datenbank einfach auf diesen Status zurück, wenn sie sich abmelden. – DickieBoy

+0

@KevinBrown: Die Idee ist, dass "Sandbox-Benutzer" möglicherweise Änderungen an bereits vorhandenen Datensätzen vornimmt und nicht für diesen Benutzer spezifisch ist. Nehmen wir zum Beispiel an, dass es ein 'Artikel'-Objekt gibt, das von einem anderen Benutzer erstellt wurde, und" Sandbox-Benutzer "ein Update durchführt. Ich möchte, dass dieses Update zurückgesetzt wird, aber nicht der gesamte "Artikel" -Datensatz entfernt wird. –

Antwort

0

Eine Möglichkeit, dies zu tun, ist eine Aktivitätstabelle, in der Sie alle Aktivitäten nach Benutzer protokollieren. Wenn ein Benutzer mit Sandbox gelöscht wird, können Sie die Aktivitäten dieses Benutzers ausführen und die entsprechenden Entitäten löschen.

bundle g model Activity user:references thing:references{polymorphic}:index 

Und wenn Sitzung zerstört wird:

current_user_activities = Activity.where(user_id: current_user.id) 
current_user_activities.each do |activity| 
    activity.thing.destroy! 
end 

current_user_activities.destroy_all 
+0

Wenn Sie "die entsprechenden Entitäten löschen" sagen, meinen Sie damit, alle von ihnen erstellten Datensätze zu zerstören? Was ist, wenn der Sandbox-Benutzer nur einen bereits vorhandenen Datensatz _updating_ aktualisiert? Ich möchte nur das Update zurücksetzen, nicht das gesamte Objekt zerstören. –

+0

Fügen Sie in diesem Fall der Aktivitätstabelle weitere Spalten hinzu, um die Aktion (Aktualisierung, Erstellung usw.) und action_details (möglicherweise json des alten Werts und des neuen Werts der betroffenen Felder) zu verfolgen und die Änderungen rückgängig zu machen. – Anand

+0

Aber das kann chaotisch werden - ein Sandbox-Benutzer kann ein Update machen, ein anderer Benutzer kann ein späteres Update auf dasselbe machen - was willst du jetzt? Sollte das ursprüngliche Benutzer-Update zurückgesetzt werden und dadurch die Änderungen des neueren Benutzers verloren gehen oder sollte es verlassen werden, weil es neuere Updates von anderen Benutzern gab? – Anand

Verwandte Themen