Schienen Transaktion nicht rollback auf Fehler bei der überprüfung
Habe ich zwei Modelle: Benutzer und Firma. Beide erhalten ein Formular, und ich bin mit einer Transaktion so:
User.transaction do
@user.save!
@company.user = @user
@company.save!
@user.reload
@user.company = @company
@user.save!
flash[:notice] = "Thank you for your registration."
redirect_to_index
end
Erhält der Benutzer in der Datenbank gespeichert, auch wenn einer der Validierungen fehlschlägt. Ich habe versucht, indem explizite Fehlerbehandlung von ActiveRecord::RecordInvalid aber es hat nicht geholfen. Ich dachte, die überprüfung würde auslösen des Fehlers ein rollback für die Transaktion sowieso. Jede Hilfe wird sehr geschätzt.
Dank
- Was RDBMS verwenden Sie? Unterstützt es Transaktionen (MyISAM vs InnoDB)?
- Ah, ich denke, das ist es. Die meisten Tabellen sind innoDB, aber es gibt einige myisam. Dank
- Siehe auch stackoverflow.com/questions/2481806/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie eine Datenbank-engine, die ACID-Transaktionen. Für mysql ist INNODB.
Wenn Benutzer oder Unternehmen ist nicht Verwendung von InnoDB-engine, können Sie es ändern, w/dieser Befehl.
die Ausnahme von
@company.save!
*sollten die trigger eine ROLLBACK-Befehl an die Datenbank geschickt werden. Sie können dies überprüfen, in der console/logfile beim ausführen von script/server mit DEBUG-log-level.versuchen, Sie zu speichern einen neuen Eintrag und überarbeiten Sie einen vorhandenen Eintrag (basierend auf dem neuen Eintrag) in der gleichen Zeit, lief in ein ähnliches problem. Habe versucht die Transaktion mit der Rettung fehlgeschlagener Validierung, sondern ließ sich auf dieser Stelle:
den code überprüft zuerst. es wird nicht versucht zu speichern, es sei denn, beide Einträge sind gültig. transaktionssemantik-Schutz gegen unvollständige Eingabe auf andere Fehler, wenn die Datenbank das unterstützt. hoffe, dass ist eine gute Lösung.
Haben Sie zu prüfen, diese Szenarien
Als ein Beispiel, wenn Sie nur eine eins-zu-eins-relation, es behandelt werden kann, die in mehr optimiert
Nun, in der Firma Modell
Habe ich nicht getestet, als Beispiel. Nur aus meinem Kopf.
Habe ich das problem verstanden hatte, richtig?
save() und destroy() werden immer unter Transaktion (siehe http://railsapi.com/doc/rails-v2.3.5/classes/ActiveRecord/Transactions/ClassMethods.html).
Was ich denke, Sie wollen zu tun ist
Dies würde Ihr problem lösen, als wenn Unternehmen die Validierungen fehlschlagen, wird eine Ausnahme ausgelöst und der Benutzer.create-Anweisung wird nie ausgeführt.
http://tempe.st/2007/05/transaction-in-rails/
Ich glaube, Sie muss ein begin-end-block außerhalb der Transaktion Schleife.
begin
..rescue
..end
block, aber ein Ausnahme-handler weiter oben im Stapel kann ebenso leicht handhaben Sie es nach dem rollback wird gemacht. Lassen Sie auch Schienen, handhaben Sie und zeigen Sie eine Fehler-Seite.