3 Stimmen

Schienenobjekt in Rettung 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

  #save failed
  flash[:notice] = "recipe.saved = #{@recipe.new_record?}"
  render 'form'
else
  #save worked
  flash[:notice] = 'Recipe added.'
  redirect_to(@recipe)
end

Wenn die Validierung für eines der Modelle fehlschlägt, geht es zum Rettungsblock jedoch im Rettungsblock sagt es, dass das Modell kein neuer Datensatz ist. Ich erwartete, dass die Validierung die Transaktion fehlschlagen, so dass das Modellobjekt als ein neuer Datensatz? was ich hier übersehen?

5voto

Stéphan Kochen Punkte 18962

Welche der beiden Rettungen schlägt tatsächlich fehl? Diejenige für @recipe oder für @dish ?

Transaktionen werden von Ihrem DBMS gehandhabt. Wenn also zum Beispiel @dish nicht speichern kann, @recipe könnte bereits gespeichert worden sein, wird aber von Ihrem DBMS rückgängig gemacht. Dies geschieht jedoch hinter dem Rücken von Rails, so dass es den Zustand der @recipe Objekt.

4voto

mbreining Punkte 7519

Aus der Rails-Dokumentation:

Ausnahmen werden für die Datenbank in den Zustand vor Beginn der Transaktion zurücksetzt. Beachten Sie bewusst, dass die nicht haben ihre Instanzdaten zurückgegeben in ihren Zustand vor der Transaktion zurückversetzt.

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

0voto

John Bachir Punkte 21921

Ich bin mir ziemlich sicher, dass die äußerste Transaktion für alles gilt, was darin enthalten ist - wenn also in diesem Fall das Speichern des Gerichts fehlschlägt, wird auch die Erstellung des Rezepts zurückgenommen.

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