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
より良いシステムを作るには必要そうなので、是非覚えておきたいです。