diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fad120c..f3998e49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,10 @@ recommendations of [keepachangelog.com](http://keepachangelog.com/). - Expand kwargs passed to `save_with_version` using double splat operator - Rails 6.1 compatibility - [#1287](https://github.com/paper-trail-gem/paper_trail/issues/1287) - Fix 'rails db:migrate' error when run against an app with mysql2 adapter +- [#1285](https://github.com/paper-trail-gem/paper_trail/pull/1285) - + Touch callback does not create a new version for skipped or ignored attributes + for ActiveRecord 6.0 and higher + ### Dependencies - Drop support for ruby 2.4 (reached EoL on 2020-03-31) diff --git a/lib/paper_trail/model_config.rb b/lib/paper_trail/model_config.rb index 18e6c74d..903b69af 100644 --- a/lib/paper_trail/model_config.rb +++ b/lib/paper_trail/model_config.rb @@ -101,7 +101,7 @@ module PaperTrail def on_touch @model_class.after_touch { |r| r.paper_trail.record_update( - force: true, + force: RAILS_LT_6_0, in_after_callback: true, is_touch: true ) @@ -129,6 +129,9 @@ module PaperTrail private + RAILS_LT_6_0 = ::ActiveRecord.gem_version < ::Gem::Version.new("6.0.0") + private_constant :RAILS_LT_6_0 + # Raises an error if the provided class is an `abstract_class`. # @api private def assert_concrete_activerecord_class(class_name) diff --git a/spec/models/skipper_spec.rb b/spec/models/skipper_spec.rb index 33242fa2..c6945846 100644 --- a/spec/models/skipper_spec.rb +++ b/spec/models/skipper_spec.rb @@ -19,6 +19,48 @@ RSpec.describe Skipper, type: :model, versioning: true do end end + describe "#touch" do + let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) } + let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) } + + if ActiveRecord.gem_version >= Gem::Version.new("6") + it "does not create a version for skipped attributes" do + skipper = Skipper.create!(another_timestamp: t1) + expect { + skipper.touch(:another_timestamp, time: t2) + }.not_to(change { skipper.versions.length }) + end + + it "does not create a version for ignored attributes" do + skipper = Skipper.create!(created_at: t1) + expect { + skipper.touch(:created_at, time: t2) + }.not_to(change { skipper.versions.length }) + end + else + it "creates a version even for skipped attributes" do + skipper = Skipper.create!(another_timestamp: t1) + expect { + skipper.touch(:another_timestamp, time: t2) + }.to(change { skipper.versions.length }) + end + + it "creates a version even for ignored attributes" do + skipper = Skipper.create!(created_at: t1) + expect { + skipper.touch(:created_at, time: t2) + }.to(change { skipper.versions.length }) + end + end + + it "creates a version for non-skipped timestamps" do + skipper = Skipper.create! + expect { + skipper.touch + }.to(change { skipper.versions.length }) + end + end + describe "#reify" do let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) } let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) }