Top > 開発ガイド > Rails Plugins > acts_as_historiable

acts_as_historiable

対象バージョン

当ドキュメントはacts_as_historiable-0.1.0向けです。

概要

Modelの更新履歴を管理するプラグインです。

設定手順

DBスキーマ

  • Migrationファイルの生成
    ruby script/generate migration acts_as_historiable
    
  • Migrationファイルの修正
    class ActsAsHistoriable < ActiveRecord::Migration
      def self.up
        ####################################################################################################################
        # Schema
        ####################################################################################################################
        create_table :histories, :force => true do |t|
          t.column :historiable_id,                 :integer,                   :default => 0,      :null => false
          t.column :poster_id,                      :integer,                   :default => 0,      :null => false
          t.column :revision,                       :integer,                   :default => 0,      :null => false
          t.column :content_method,                 :string,    :limit => 32,   :default => '',     :null => false
          t.column :historiable_type,               :string,    :limit => 96,   :default => '',     :null => false
          t.column :poster_type,                    :string,    :limit => 96,   :default => '',     :null => false
          t.column :content,                        :text,                                          :null => false
          t.column :created_at,                     :datetime
        end
    
        ####################################################################################################################
        # Indexes
        ####################################################################################################################
        add_index(:histories,   [:historiable_id, :historiable_type, :revision],    {:name => 'histories_historiable_id'})
        add_index(:histories,   [:poster_id],                                       {:name => 'histories_poster_id'})
      end
    
      def self.down
        drop_table :histories
      end
    end
    
  • Migrateの実行
    rake db:migrate
    

Modelへの適用

* acts_as_historiable(options = {})
  * Options
    * :contents
      履歴を保存するカラム名を指定します。複数のカラムを履歴保存したい場合はArrayで指定可能です。
      default => [:content, :comment]

    * :historiable_type
      モデルのクラス名を指定します。基本的にはデフォルト値のままで問題ありません。
      default => ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s

    * :poster_type
      履歴と紐付けるユーザモデルのクラス名を指定します。
      default => 'RubricksUser'

  * Examples
    * class SampleModel < ActiveRecord::Base
        acts_as_historiable :contents => [:article, :title], :poster_type => 'User'
      end

利用可能なメソッド

Model(インスタンスメソッド)

* clear_histories(revision = nil)
  * Note
    履歴のクリアを行います。revisionが指定された場合はrevisionより古い履歴を削除します。

  * Examples
    * sample_model = SampleModel.find(1)
      sample_model.clear_histories

* find_histories(revision)
  * Note
    特定revisionの履歴を取得します。複数のカラムが履歴保存されている場合は全て取得されます。

  * Examples
    * sample_model = SampleModel.find(1)
      histories = sample_model.find_histories(5)
      histories.each do |history|
        p history.content
      end

* find_history(revision, content_method)
  * Note
    特定revisionの特定カラムの履歴を取得します。

  * Examples
    * sample_model = SampleModel.find(1)
      history = sample_model.find_history(5, :article)
      p history.content

* revert_to(revision)
  * Note
    特定revisionに巻き戻します。

  * Examples
    * sample_model = SampleModel.find(1)
      sample_model.revert_to(3)

Model(クラスメソッド)

* clear_histories(revision, historiable_id)
  * Note
    履歴のクリアを行います。指定されたrevisionより古い履歴を削除します。

  * Examples
    * SampleModel.clear_histories(5, 1)

* find_histories(revision, historiable_id)
  * Note
    特定revisionの履歴を取得します。複数のカラムが履歴保存されている場合は全て取得されます。

  * Examples
    * hisrories = SampleModel.find_histories(5, 1)
      histories.each do |history|
        p history.content
      end

* find_history(revision, historiable_id, content_method)
  * Note
    特定revisionの特定カラムの履歴を取得します。

  * Examples
    * history = SampleModel.find_history(5, 1, :article)
      p history.content

* revert_to(revision, historiable_id)
  * Note
    特定revisionに巻き戻します。

  * Examples
    * SampleModel.revert_to(3, 1)

View

* diff(options = {})
  * Note
  2つのrevisionの差分を表示します。

  * Options
    * :content
      比較するカラム名を指定します。
      default =>  :content

    * :from
    * :to
      比較対象となるrevisionを指定します。数値に加えて下記のシンボルを指定可能です。
      default => :previous 及び :current
      * :first, :min
        最も古い履歴を表します。
      * :current, :last, :max
        現在の履歴を表します。
      * :previous
        現在の一つ前の履歴を表します。

    * :instance
      比較するモデルのインスタンスを指定します。この指定を行った場合、
      後述の「:historiable_id」及び「:historiable_type」の指定は不要です。
      default => nil

    * :with_histories
      「:instance」で指定したインスタンスが履歴を保持しているか否かを指定します。
      default =>  false

    * :historiable_id
    * :historiable_type
      比較するモデルのクラス名及びインスタンスIDを指定します。この指定を行った場合、
      前述の「:instance」及び「:with_histories」の指定は不要です。

    * :html
      HTMLオプション
      * :strip
        HTMLタグを除去するか否かを指定します。
        default =>  true
      * :add_class
        追加された文字列に対して適用するHTMLクラスを指定します。
        default =>  'diff_text_add'
      * :delete_class
        削除された文字列に対して適用するHTMLクラスを指定します。
        default =>  'diff_text_delete'

  * Examples
    * <% sample_model = SampleModel.find(1) %>
      <%= diff({
        :content            => :article,
        :instance           => @sample_model,
        :from               => :first,
        :to                 => :last,
      }) %>

    * <% sample_model = SampleModel.find(1, :include => :histories) %>
      <%= diff({
        :content            => :article,
        :instance           => @sample_model,
        :with_histories     => true,
      }) %>

    * <%= diff({
        :content            => :article,
        :historiable_type   => 'SampleModel',
        :historiable_id     => 1,
      }) %>