Support for custom association name

This commit is contained in:
Edward Tsech 2011-07-18 22:07:46 +07:00
parent 7a7a899f71
commit db6fbbc284
5 changed files with 37 additions and 6 deletions

View File

@ -41,7 +41,10 @@ module PaperTrail
cattr_accessor :paper_trail_enabled_for_model
self.paper_trail_enabled_for_model = true
has_many :versions, :class_name => version_class_name, :as => :item, :order => "created_at ASC, #{self.primary_key} ASC"
cattr_accessor :paper_trail_assoc
self.paper_trail_assoc = options[:association] || :versions
has_many self.paper_trail_assoc, :class_name => version_class_name, :as => :item, :order => "created_at ASC, #{self.primary_key} ASC"
after_create :record_create
before_update :record_update
@ -77,13 +80,13 @@ module PaperTrail
def version_at(timestamp, reify_options={})
# Because a version stores how its object looked *before* the change,
# we need to look for the first version created *after* the timestamp.
version = versions.after(timestamp).first
version = send(self.class.paper_trail_assoc).after(timestamp).first
version ? version.reify(reify_options) : self
end
# Returns the object (not a Version) as it was most recently.
def previous_version
preceding_version = version ? version.previous : versions.last
preceding_version = version ? version.previous : send(self.class.paper_trail_assoc).last
preceding_version.try :reify
end
@ -103,7 +106,7 @@ module PaperTrail
def record_create
if switched_on?
versions.create merge_metadata(:event => 'create', :whodunnit => PaperTrail.whodunnit)
send(self.class.paper_trail_assoc).create merge_metadata(:event => 'create', :whodunnit => PaperTrail.whodunnit)
end
end
@ -120,7 +123,7 @@ module PaperTrail
!notably_changed.include?(key)
end.to_yaml
end
versions.build merge_metadata(data)
send(self.class.paper_trail_assoc).build merge_metadata(data)
end
end
@ -132,7 +135,7 @@ module PaperTrail
:object => object_to_string(item_before_change),
:whodunnit => PaperTrail.whodunnit)
end
versions.send :load_target
send(self.class.paper_trail_assoc).send :load_target
end
def merge_metadata(data)

View File

@ -0,0 +1,3 @@
class Document < ActiveRecord::Base
has_paper_trail :association => :paper_trail_versions
end

View File

@ -93,6 +93,10 @@ class SetUpTestTables < ActiveRecord::Migration
t.string :name
t.string :species # single table inheritance column
end
create_table :documents, :force => true do |t|
t.string :name
end
end
def self.down
@ -110,5 +114,6 @@ class SetUpTestTables < ActiveRecord::Migration
remove_index :versions, :column => [:item_type, :item_id]
drop_table :versions
drop_table :widgets
drop_table :documents
end
end

Binary file not shown.

View File

@ -815,6 +815,26 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
end
end
context 'An model with custom association' do
setup do
@doc = Document.create
@doc.update_attributes :name => 'Doc 1'
end
should 'should not respond on versions method' do
assert !@doc.respond_to?(:versions)
end
should 'should create new version record' do
assert_equal 2, @doc.paper_trail_versions.length
end
should 'should normally respond to prevous_version' do
@doc.update_attributes :name => 'Doc 2'
assert_equal 3, @doc.paper_trail_versions.length
assert_equal 'Doc 1', @doc.previous_version.name
end
end
private