def around_save
ActiveRecord::Base.transaction do
raise ActiveRecord::Rollback # this will actually ROLLBACK
yield # calls the actual save method
raise ActiveRecord::Rollback # this will cause a COMMIT!!! because it affect only this internal transaction.
# OTHER ACTIONS NOT EXECUTED BUT BEING A INTERNAL TRANSACTION, THE PARENT WILL COMMIT, because parent hasn't failed.
end
end
Also ... ich around_save kommen denke schon auf einem Transaktionsblock, so dass Sie don 't müssen hinzufügen, dass zusätzliche ActiveRecord :: Base.transaction blockieren, weil Rollbacks nicht propagieren
Also, wenn Sie Rollback vor oder nach der Ausbeute, müssen Sie diese interne Transaktion entfernen.
def around_save
#ActiveRecord::Base.transaction do
raise ActiveRecord::Rollback # this will actually ROLLBACK
yield # calls the actual save method
raise ActiveRecord::Rollback # this will actually ROLLBACK
# end
end
EDIT: Lesen, was ich schrieb ... scheinen jetzt schwer zu verstehen. Der Punkt ist: Wenn Sie sind gonna aroud_save
Gebrauch nicht wieder Wrapp mit ActiveRecord::Base.transaction
(wie im letzten Beispiel tun), weil Schienen wird der Anruf zu around_save
mit ist eigenen ActiveRecord::Base.transaction
so wickeln, wenn Sie raise ActiveRecord::Rollback
Sie rollen wieder die interne Transaktion, so können Sie mit Extrangergebnissen und Teilsicherungen enden (wie im ersten Beispiel, das FAIL ist).
Rails wickelt 'Model # save' in einer Transaktion trotzdem. Sie sollten keine zweite Transaktion innerhalb des Hooks around_save öffnen. Stattdessen sollten Sie nur 'ActiveRecord :: Rollback' aufrufen. – BBonifield