From c8c37561beb1b9d4816218d411b572ef25833f68 Mon Sep 17 00:00:00 2001 From: Ben Atkins Date: Wed, 16 Apr 2014 12:17:33 -0400 Subject: [PATCH] Versioned models should have their version association getter updated upon destruction when applicable --- CHANGELOG.md | 2 ++ lib/paper_trail/has_paper_trail.rb | 2 +- spec/models/widget_spec.rb | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fc091d3..4e409657 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ for return values from `current_user` method. - `PaperTrail::Cleaner.clean_versions!` should group versions by `PaperTrail.timestamp_field` when deciding which ones to keep / destroy, instead of always grouping by the `created_at` field. + - If `destroy` actions are tracked for a versioned model, invoking `destroy` on the model will cause the corresponding version that + gets generated to be assigned into the `model_instance#version_association_name` accessor (usally `model_instance#version`). ## 3.0.1 diff --git a/lib/paper_trail/has_paper_trail.rb b/lib/paper_trail/has_paper_trail.rb index a815f35a..87257040 100644 --- a/lib/paper_trail/has_paper_trail.rb +++ b/lib/paper_trail/has_paper_trail.rb @@ -295,7 +295,7 @@ module PaperTrail :object => self.class.paper_trail_version_class.object_col_is_json? ? object_attrs : PaperTrail.serializer.dump(object_attrs), :whodunnit => PaperTrail.whodunnit } - self.class.paper_trail_version_class.create merge_metadata(data) + send("#{self.class.version_association_name}=", self.class.paper_trail_version_class.create(merge_metadata(data))) send(self.class.versions_association_name).send :load_target end end diff --git a/spec/models/widget_spec.rb b/spec/models/widget_spec.rb index 4184724b..00f43f8e 100644 --- a/spec/models/widget_spec.rb +++ b/spec/models/widget_spec.rb @@ -21,6 +21,21 @@ describe Widget do end end + describe "Callbacks", :versioning => true do + describe :after_destroy do + it "should create a version for that event" do + expect { widget.destroy }.to change(widget.versions, :count).by(1) + end + + it "should assign the version into the `versions_association_name`" do + widget.version.should be_nil + widget.destroy + widget.version.should_not be_nil + widget.version.should == widget.versions.last + end + end + end + describe "Methods" do describe "Instance", :versioning => true do describe :whodunnit do