14

現在取り組んでいるプロジェクトでは、オブジェクトのバージョン管理を実装する必要があります。残念ながら、各オブジェクトの完全な履歴を保持する必要があるため、Papertrail のような単一のテーブル ソリューションはすぐに管理できなくなります。私が気に入っている Papertrail の機能がありますが、モデルごとに個別のテーブル (acts_as_versioned など) を使用したソリューションでは見つけることができませんでした。

  • コントローラーとモデルの両方からのメタ情報を保存する機能
  • データはシリアル化されるため、スキーマの変更によってバージョン テーブルが変更されることはありません
  • バージョンをトラバースするための強力な方法
  • 変更責任の自動追跡

また、Papertrail にはないボーナスとなる機能もいくつかあります。

  • 組み込みのバージョン差分サポート
  • フルバージョンではなく差分

現在、モデルごとに個別のテーブルを使用するように Papertrail をフォークすることを検討していますが、既存のソリューションがあればその労力を節約したいと考えています。

更新: Vestal Versions はデフォルトで 1 つのテーブルを使用しますが、モデルごとにカスタム バージョン クラスを提供し、ActiveRecord の「set_table_name」メソッドを使用することで、モデルごとに個別のテーブルを作成することができました。Vestal Versions には diff サポートも組み込まれていますが、そのインターフェイスは Papertrails ほど強力ではありません。また、協会のサポートもありません。

更新 2: papertrail はより活発なプロジェクトであるように思われるため、gem をフォークし、vestal バージョンと同様のカスタム クラス サポートを追加しました。これにより、モデルごとに個別のテーブルを定義できるようになりました。私のフォークはここにありますが、すぐにメインのプロジェクト リポジトリに取り込まれることを願っています。 https://github.com/benzittlau/paper_trail

4

2 に答える 2

12

:class_name オプションを使用して、カスタム バージョンのサブクラスを指定できます。

class Post < ActiveRecord::Base
  has_paper_trail :class_name => 'PostVersion'
end

class PostVersion < Version
  # custom behaviour, e.g:
  self.table_name = :post_versions # in rails 2, use set_table_name
end

これにより、各モデルのバージョンを個別のテーブルに保存できるため、多数のバージョンを作成する場合に便利です。

于 2011-10-29T14:07:44.810 に答える
0

memento パターンを使用して履歴テーブルを作成する Rails gem/plugin であるVestal Versionsを使用しており、属性の差分を after_save および after_destroy コールバックに保存します。

また、いつ変更されたかを記録し、バージョン番号をインクリメントして、特定のバージョンまたは特定の日付または時刻に存在するバージョンにロールバックできるようにします。

次に、次のようにオブジェクトをプルアップできます。

@user = User.last
@user.versions.last.changes #=> {:name => ['Robert','Bob']}

私はかなりの大ファンです。

于 2011-03-18T02:49:12.373 に答える