From db6fbbc284164354d297d19d8af1d2f9c98276d8 Mon Sep 17 00:00:00 2001 From: Edward Tsech Date: Mon, 18 Jul 2011 22:07:46 +0700 Subject: [PATCH] Support for custom association name --- lib/paper_trail/has_paper_trail.rb | 15 +++++++------ test/dummy/app/models/document.rb | 3 +++ .../20110208155312_set_up_test_tables.rb | 5 +++++ test/dummy/db/test.sqlite3 | Bin 22528 -> 23552 bytes test/unit/model_test.rb | 20 ++++++++++++++++++ 5 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 test/dummy/app/models/document.rb diff --git a/lib/paper_trail/has_paper_trail.rb b/lib/paper_trail/has_paper_trail.rb index 931ef71e..d0997343 100644 --- a/lib/paper_trail/has_paper_trail.rb +++ b/lib/paper_trail/has_paper_trail.rb @@ -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) diff --git a/test/dummy/app/models/document.rb b/test/dummy/app/models/document.rb new file mode 100644 index 00000000..13d11ca3 --- /dev/null +++ b/test/dummy/app/models/document.rb @@ -0,0 +1,3 @@ +class Document < ActiveRecord::Base + has_paper_trail :association => :paper_trail_versions +end diff --git a/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb b/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb index df02a716..d5433a65 100644 --- a/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +++ b/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb @@ -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 diff --git a/test/dummy/db/test.sqlite3 b/test/dummy/db/test.sqlite3 index e499d270df2bb435627240080b280169088b60a3..ac9117ca4c7bdd1d36e86b3f375518805bb3768e 100644 GIT binary patch delta 110 zcmZqJz}T>Zae_9Z;6|Mr?n3Mg84OHSOz)XHnK&7%8D21COl%A?uM=VymzQU3^e#zE z%1KShPcF?(%_}K}GsK;PTpdGP6+#@Hd|VZjVB(WE%9u@FASJ}8x%q{M1pgud765>` BBUk_c delta 40 wcmZqJ!Pu~Yae_9Zz($=L?gDHKFBq7rnBFsYGI26iGrX8A$Z}=#3l9l?01QhF9{>OV diff --git a/test/unit/model_test.rb b/test/unit/model_test.rb index 23fc6c5c..29ad6a13 100644 --- a/test/unit/model_test.rb +++ b/test/unit/model_test.rb @@ -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