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
|
cattr_accessor :paper_trail_enabled_for_model
|
||||||
self.paper_trail_enabled_for_model = true
|
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
|
after_create :record_create
|
||||||
before_update :record_update
|
before_update :record_update
|
||||||
|
@ -77,13 +80,13 @@ module PaperTrail
|
||||||
def version_at(timestamp, reify_options={})
|
def version_at(timestamp, reify_options={})
|
||||||
# Because a version stores how its object looked *before* the change,
|
# Because a version stores how its object looked *before* the change,
|
||||||
# we need to look for the first version created *after* the timestamp.
|
# 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
|
version ? version.reify(reify_options) : self
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the object (not a Version) as it was most recently.
|
# Returns the object (not a Version) as it was most recently.
|
||||||
def previous_version
|
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
|
preceding_version.try :reify
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -103,7 +106,7 @@ module PaperTrail
|
||||||
|
|
||||||
def record_create
|
def record_create
|
||||||
if switched_on?
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -120,7 +123,7 @@ module PaperTrail
|
||||||
!notably_changed.include?(key)
|
!notably_changed.include?(key)
|
||||||
end.to_yaml
|
end.to_yaml
|
||||||
end
|
end
|
||||||
versions.build merge_metadata(data)
|
send(self.class.paper_trail_assoc).build merge_metadata(data)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -132,7 +135,7 @@ module PaperTrail
|
||||||
:object => object_to_string(item_before_change),
|
:object => object_to_string(item_before_change),
|
||||||
:whodunnit => PaperTrail.whodunnit)
|
:whodunnit => PaperTrail.whodunnit)
|
||||||
end
|
end
|
||||||
versions.send :load_target
|
send(self.class.paper_trail_assoc).send :load_target
|
||||||
end
|
end
|
||||||
|
|
||||||
def merge_metadata(data)
|
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 :name
|
||||||
t.string :species # single table inheritance column
|
t.string :species # single table inheritance column
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table :documents, :force => true do |t|
|
||||||
|
t.string :name
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.down
|
def self.down
|
||||||
|
@ -110,5 +114,6 @@ class SetUpTestTables < ActiveRecord::Migration
|
||||||
remove_index :versions, :column => [:item_type, :item_id]
|
remove_index :versions, :column => [:item_type, :item_id]
|
||||||
drop_table :versions
|
drop_table :versions
|
||||||
drop_table :widgets
|
drop_table :widgets
|
||||||
|
drop_table :documents
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Binary file not shown.
|
@ -815,6 +815,26 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
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
|
private
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue