排他制御には「楽観的ロック」と「悲観的ロック」があります。
ユーザーAとユーザーBがいた場合
・楽観的ロック
ユーザーA、ユーザーB共に編集画面を開くことができるが、ユーザーAが更新した場合ユーザーBの更新は失敗する。
・悲観的ロック
ユーザーAが編集画面を開いてる場合ユーザーBは編集画面を開くことができないにする。
という感じです。
操作性のことを考えると楽観的ロックの方がいいのかな...
今回は楽観的ロックをかけてみます。
Railsでは「lock_version」というカラムを追加するだけで楽観的ロックを実現することができます。
updateの際にlock_versionの値を見てDBと同じなら更新に成功し、
違ったらActiveRecord::StaleObjectErrorが発生します。
$ rails g migration AddLockVersionToUsers
# db/migrate/20130622123202_add_lock_version_to_users.rb class AddLockVersionToUsers < ActiveRecord::Migration def change add_column :users, :lock_version, :integer, default: 0 end end
# app/views/users/_form.html.erb ... <%= f.hidden_field :lock_version %> ...
# app/controllers/users_controller.rb ... def user_params params.require(:user).permit(:name, :lock_version) end
以上です。簡単ですね。