【Rails】 DBに楽観的ロックをかける

排他制御には「楽観的ロック」と「悲観的ロック」があります。

ユーザー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

以上です。簡単ですね。