Touch callback does not always create version

This commit is contained in:
Jake Quain 2021-01-04 10:51:39 -05:00 committed by Jared Beck
parent d0cac81152
commit 584e2f732e
3 changed files with 50 additions and 1 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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) }