3 Stimmen

Rails Objekt im Rescue nach Transaktionsfehler wird gespeichert

Ich habe eine Transaktion, um sicherzustellen, dass zwei Modelle gleichzeitig gespeichert werden.

begin
  Recipe.transaction do
    @recipe.save!
    if @dish
      @dish.save!
    end
  end
rescue

  # Speichern fehlgeschlagen
  flash[:notice] = "recipe.saved = #{@recipe.new_record?}"
  render 'form'
else
  # Speichern erfolgreich
  flash[:notice] = 'Rezept hinzugefügt.'
  redirect_to(@recipe)
end

Wenn die Validierung für eines der Modelle fehlschlägt, gelangt es in den Rescue-Block. Allerdings steht im Rescue-Block, dass das Modell kein neuer Datensatz ist. Ich hätte erwartet, dass die Validierung dazu führt, dass die Transaktion fehlschlägt und das Modellobjekt als neuer Datensatz bleibt. Was fehlt mir hier?

5voto

Stéphan Kochen Punkte 18962

Welcher der beiden Speicherungen schlägt tatsächlich fehl? Die für @recipe oder für @dish?

Transaktionen werden von Ihrem DBMS verwaltet. Wenn also z.B. @dish nicht gespeichert werden kann, wurde möglicherweise bereits @recipe gespeichert, wird aber vom DBMS rückgängig gemacht. Dies geschieht jedoch im Hintergrund von Rails aus, und daher wird der Zustand des @recipe Objekts nicht zurückgesetzt.

4voto

mbreining Punkte 7519

Vom Rails-Dokumentation:

Ausnahmen erzwingen einen ROLLBACK, der die Datenbank in den Zustand vor Beginn der Transaktion zurückversetzt. Beachten Sie jedoch, dass die Objekte nicht auf ihren Zustand vor der Transaktion zurückgesetzt werden.

http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

0voto

John Bachir Punkte 21921

Ich bin ziemlich sicher, dass die äußerste Transaktion auf alles darin angewendet wird - und somit wird in diesem Fall, wenn das Speichern des Gerichts fehlschlägt, auch die Erstellung des Rezepts zurückgerollt.

Vielleicht verwenden Sie keine InnoDB-Tabellen? MyISAM unterstützt keine Transaktionen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X