Edited at

rails のtransaction処理

More than 1 year has passed since last update.


transaction 処理

不可分の一連の処理作業です。


単一モデルにおける実装

処理に制約をつけて、わざとロールバックさせられる環境を作ります。


User.rb


validates_presence_of :username
#usernameを必須にする


実際のロジックはこんな感じです。

#コンソール

User.transaction do
user1 = User.new(username: "ttm", age: 25)
user1.save!
user2 = User.new(username: nil, age: 26)
user2.save!
end

saveではダメです。transactionは例外処理に反応してロールバックするので、!をつけて例外を起こさせるようにします。


複数モデルにまたがる実装

新しいモデルと制約を課します。


Book.rb


validates_presence_of :title
#titleを必須にする


ロジックは下の感じ。

#コンソール

ActiveRecord::Base.transaction do
user = User.new(username: "ttm", age: 25)
user.save!
book = Book.new(title: nil)
book.save!
end

より良いシステムを作るには必要そうなので、是非覚えておきたいです。