railsでもtransaction機能を使おう
railsからプログラミングをやりだした自分は、どうしてもsqlの機能についておろそかになってしまいます。
sqlの処理はデータベースの処理なので、大切なユーザーのデータです。
すいません、削除しちゃいました(テヘ
では、問題がすみません。
そんな大事なデータを連続処理をする場合に、使うのがtransactionです。
使い方
一つの処理で連続して、何かをする場合は、transactionをつけましょう。
例えば、ユーザーが記事を更新した場合に、一番最後の記事を消したい場合があったとします。(そんなことないと思うが・・・苦笑)
def update @post.update(post_params) Post.last.destroy end
この場合、一連の処理を流れにしているので、万が一Post.last.destroyで失敗した場合に、処理を全部戻したいとします。
そんな時に使えるのが、transactionになります。
def update ActiveRecord::Base.transaction do @post.update(post_params) Post.last.destroy end end
transactionをするには、error(例外)を検出しないといけないので、下記のようになります。
def update ActiveRecord::Base.transaction do @post.update!(post_params) Post.last.destroy! end end
!をつけて、error(例外)を出させるようにします。
ただのupdateでは、true or falseしか返ってこないので、transactionが反応してくれません。
これで処理がどこかでおかしくなった場合は、すべての処理が巻き戻ります。
sqlすげー・・・
まとめ
transactionを使うことで、一連の処理をしている場合に、巻き戻しを行うことができるようになります。
個別の処理の場合は、if文で処理を書けば対応できることが多いと思います。
ポイントは次のところですね。
- 連続して処理を行う場合
- error(例外)を出させる
参考