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,
}) %>
