2011-01-23

ActiveRecordでデータの履歴管理をする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのActiveRecordでデータの履歴管理をするには、
acts_as_versioned
を利用するケースが多いようです。

ですが、2.3系でうまく動かす方法がよくわかりません。

で調べていたところ、
vestal_versions
というものがあり、こちらもよさげで2.3で利用できました。

使い方は、まずgemでインストール
gem install vestal_versions

で利用するRialsプロジェクトのconfig/environment.rbに
config.gem 'vestal_versions'
を記述。その後、
rake gems:install
script/generate vestal_versions
rake db:migrate
とすれば利用の準備が完了です。

履歴管理を行いたいModelに
versioned
とすれば、このModelで履歴管理ができます。

これでvestal_versions用のメソッドが追加されるのですが、重要そうなのは
version:現在の履歴version番号を返す
revert_to:データを元に戻す。元に戻すためにはversion番号とか、どれくらい前に変更したかとかを渡す感じ
ぐらいでいい気がします。

具体的な利用例は、
vestal_versions
に書いてあります。

acts_as_versionedでは
履歴管理を行いたいModelに対して専用の履歴管理テーブルを作成してデータをまるまるコピーしておく感じなのですが、
vestal_versionsでは
verions
という専用のテーブルが作成されて、これですべてのモデルの変更履歴管理をします。

acts_as_versionedでは、元のModelにmigrationで変更を加えたら、履歴テーブルにも忘れずに変更をいれないといけないようですが、vestal_versionsではその必要はなさそうです。

しかし変更履歴一覧みたいなものを見せるならば、
acts_as_versioned
では普通の1対多の結合みたいになっているので簡単に変更履歴を作成できそうです。
vestal_versionsでは変更部分のみが記録されているので、元のデータをModelとして復活させるには、
最初にversionで今のversionを取得して、
revert_toで必要なだけデータを戻す必要がありそうです。

特に履歴管理しなくてもいいのだけど、あったらあったで便利そうなことがあったので調べてみました。
他の履歴管理手段が以下のサイトで紹介されています。
http://ruby-toolbox.com/categories/activerecord_versioning.html
コメントを投稿