Ist es möglich, dass Datenbanktransaktionen mehrere Anfragen in Rails umfassen?

8

Ich habe ein Formular, das mehrere Seiten umfasst. Die Art und Weise, wie es jetzt eingerichtet ist, ist nicht ideal, da es jede Seite speichert (in die Datenbank), wenn sie gesendet wird. Wenn der Benutzer das Formular nicht auf allen Seiten ausfüllt, wird eine unvollständige Benutzerregistrierung in der Datenbank gespeichert.

Ich möchte die Saves "zurücksetzen", wenn der Benutzer das Formular nicht vollständig ausfüllt.

Gibt es also eine Möglichkeit, eine Transaktion einzurichten, die beginnt, wenn der Benutzer das erste Formular ausfüllt und endet, wenn der Benutzer auf der letzten Seite fertig ist?

    
vrish88 30.03.2009, 22:13
quelle

5 Antworten

5

Was du suchst, ist das acts_as_state_machine-Juwel . Wenn Sie mit State Machines nicht vertraut sind, werfen Sie einen Blick hier .

    
Matt Darby 30.03.2009, 22:28
quelle
2

Um die spezifische Frage zu beantworten, glaube ich nicht, dass es eine Möglichkeit gibt, eine Transaktion in der Datenbank einzurichten, die das tut, was Sie wollen. Denken Sie darüber nach, und Sie werden sehen, warum: Es gibt keine Garantie, dass die verschiedenen Teile Ihres mehrseitigen Vorgangs mit demselben Prozess behandelt werden. Oder sehr wahrscheinlich sogar den gleichen Server. Wenn die Anforderung Datenbankverbindungen umfasst, wie in diesem Fall, sind die nicht festgeschriebenen Teile einer Verbindung für die anderen Verbindungen unsichtbar.

Neben den bereits erwähnten Ideen würde ich eine oder mehrere "Staging" -Tabellen in Betracht ziehen, um die bereits eingegebenen unvollständigen Daten zu speichern. Wenn der Benutzer dann fertig ist, kann eine einzelne Transaktion die Daten auf die permanenten Tabellen anwenden und die Staging-Daten entfernen. Unvollständige Daten können nach einem Alterskriterium durch einen Hintergrundprozess gelöscht werden, sobald Sie sicher sind, dass die Sitzung beendet wurde oder bis der Benutzer zurückkehrt, falls dies Ihren Anforderungen entspricht.

Ich würde mich dieser Herangehensweise zuwenden, insbesondere wenn ich regelmäßig unvollständige Transaktionen erwarten würde, weil ich auf diese Weise nicht mit unvollständigen Daten in meinen Hauptmodellen umgehen muss.

    
Mike Woodhouse 30.03.2009 22:46
quelle
1

Ich denke, es ist sinnvoll, jede Seite zu speichern, denn wenn es sich um einen langwierigen Prozess handelt und der Benutzer in der Mitte unterbrochen wird, möchte er möglicherweise seine Zwischenergebnisse speichern und dort weitermachen, wo er später aufgehört hat.

Wenn Sie denken, dass dies auch eine gute Idee ist, dann würde Ihr Design eine Markierung speichern, um anzuzeigen, ob ein bestimmtes Teil Teil einer lang andauernden Transaktion war, die noch nicht abgeschlossen war. Setzen Sie die Flagge, wenn das letzte Stück fertig war und die Schaltfläche "Speichern" gedrückt wurde. Geben Sie einen Zeitüberschreitungswert ein, der besagt, dass die Zwischenstücke nach einem bestimmten Zeitraum gelöscht werden, wenn sie die Genehmigung für das endgültige Speichern erhalten haben.

    
duffymo 30.03.2009 22:25
quelle
1

Ich kenne die Antwort auf Ihre ursprüngliche Frage nicht, aber trotzdem ...

Warum speichern Sie nicht alle Daten in einer Sitzungsvariablen, anstatt auf jeder Seite zu speichern? Dann können Sie am Ende eine Seite haben, die die Daten in der Sitzung in die Datenbank speichert. Auf diese Weise haben Sie nie etwas in der Datenbank gespeichert.

    
Jason Punyon 30.03.2009 22:20
quelle
1

Es ist keine gute Idee, eine Datenbanktransaktion zu öffnen, die mehrere Anforderungen umfassen würde. Berücksichtigen Sie die Situation, in der ein Benutzer den Browser gerade schließt, bevor die Transaktion ausgeführt wird. Sie haben eine verwaiste Transaktion, die weder zurückgesetzt noch bestätigt wurde.

Fügen Sie einfach ein Flag in die Datenbank ein, etwa REG_COMPLETE, das nur auf der letzten Seite des Registrierungsprozesses gesetzt wird. Dann können Sie mit dieser unvollständigen Aufzeichnung filtern / scrubben / was auch immer Sie mögen ... vielleicht schicken Sie ihnen eine E-Mail, die sie auffordert, zu beenden?

    
Al W 30.03.2009 22:36
quelle