lock_versionの使い方

ActiveRecordには楽観的ロックの機構が用意されている.整数型でlock_versionという名前のカラムを作るとバージョン番号に基づいて競合を判定する仕組み.国内のいくつかのサイトでは,このカラムを追加すれば終わりみたいな書き方がされていたけど,実装の仕方によってはもう一手間いる
これはscaffoldで生成したページでは,例えば更新の場合にコントローラは次のような動きをする

  1. show: 一覧から更新のIDをeditに渡す
  2. edit: IDからActiveRecordを生成しviewに表示.ユーザはこれを編集
  3. update: editのviewから編集内容とIDが渡され,IDを元にActiveRecordを再度生成,修正内容で更新

3.でもう一度ActiveRecordが生成されてしまうのがだめなところ.2.時点でのlock_versionで3.によって生成されたActiveRecordの値を上書きしないといけない.3.の前に別セッションが更新を行うと,更新後のlock_versionが入っていて最新と判定されてしまい,競合にならない

解決

formのhiddenフィールドにこっそりいれておこうね