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
だから... ...私は、あなたドンので、around_saveトランザクションブロックにすでに来ると思いますその余分なActiveRecord :: Base.transaction doブロックを追加する必要はありません。ロールバックは伝播しないため
したがって、前回または後にロールバックする場合は、その内部トランザクションを削除する必要があります。
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:は私が書いたものを読んで...今理解するのが難しいようです。ポイントは次のとおりです。あなたがレールにaround_save
への呼び出しをラップするため、(は、最後の例のように行う)を使用aroud_save
はActiveRecord::Base.transaction
再びwrappしていないつもりであれば自分でActiveRecord::Base.transaction
ので、あなたが唯一のロールバックされraise ActiveRecord::Rollback
ときに最も内部トランザクションであるため、(最初の例のように)FAILのように、結果と部分的な保存で終わることができます。あなたはafter_save
コールバックで保存中止したい場合は
Railsはとにかくトランザクション内の 'モデル#save'をラップします。 around_saveフック内で2番目のトランザクションを開くべきではありません。むしろ 'ActiveRecord :: Rollback'を呼び出すだけです。 – BBonifield