Support for custom association name
This commit is contained in:
parent
7a7a899f71
commit
db6fbbc284
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
class Document < ActiveRecord::Base
|
||||
has_paper_trail :association => :paper_trail_versions
|
||||
end
|
|
@ -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.
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue