mirror of
https://github.com/paper-trail-gem/paper_trail.git
synced 2022-11-09 11:33:19 -05:00
Skip creating version for timestamp when changed attributed is ignored via Hash
- It was only ignoring attributes defined as symbols. - It now ignores when attributes are either defined as symbols or Hashes. - Consolidates calculation to be shared when determining if changed and not ignored. Resolves #1240
This commit is contained in:
parent
8f73c1540e
commit
f7a94d0b63
5 changed files with 28 additions and 7 deletions
|
@ -27,6 +27,9 @@ recommendations of [keepachangelog.com](http://keepachangelog.com/).
|
||||||
- [#1238](https://github.com/paper-trail-gem/paper_trail/pull/1238) -
|
- [#1238](https://github.com/paper-trail-gem/paper_trail/pull/1238) -
|
||||||
Query optimization in `reify`
|
Query optimization in `reify`
|
||||||
|
|
||||||
|
- [#1256](https://github.com/paper-trail-gem/paper_trail/pull/1256) -
|
||||||
|
Skip version for timestamp when changed attributed is ignored via Hash
|
||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
|
|
||||||
- Drop support for rails <= 5.1 (reached EOL when 6.0 was released,
|
- Drop support for rails <= 5.1 (reached EOL when 6.0 was released,
|
||||||
|
|
|
@ -107,7 +107,7 @@ module PaperTrail
|
||||||
end
|
end
|
||||||
|
|
||||||
# @api private
|
# @api private
|
||||||
def changed_and_not_ignored
|
def calculated_ignored_array
|
||||||
ignore = @record.paper_trail_options[:ignore].dup
|
ignore = @record.paper_trail_options[:ignore].dup
|
||||||
# Remove Hash arguments and then evaluate whether the attributes (the
|
# Remove Hash arguments and then evaluate whether the attributes (the
|
||||||
# keys of the hash) should also get pushed into the collection.
|
# keys of the hash) should also get pushed into the collection.
|
||||||
|
@ -117,8 +117,12 @@ module PaperTrail
|
||||||
ignore << attr if condition.respond_to?(:call) && condition.call(@record)
|
ignore << attr if condition.respond_to?(:call) && condition.call(@record)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# @api private
|
||||||
|
def changed_and_not_ignored
|
||||||
skip = @record.paper_trail_options[:skip]
|
skip = @record.paper_trail_options[:skip]
|
||||||
(changed_in_latest_version - ignore) - skip
|
(changed_in_latest_version - calculated_ignored_array) - skip
|
||||||
end
|
end
|
||||||
|
|
||||||
# @api private
|
# @api private
|
||||||
|
@ -148,7 +152,7 @@ module PaperTrail
|
||||||
#
|
#
|
||||||
# @api private
|
# @api private
|
||||||
def ignored_attr_has_changed?
|
def ignored_attr_has_changed?
|
||||||
ignored = @record.paper_trail_options[:ignore] + @record.paper_trail_options[:skip]
|
ignored = calculated_ignored_array + @record.paper_trail_options[:skip]
|
||||||
ignored.any? && (changed_in_latest_version & ignored).any?
|
ignored.any? && (changed_in_latest_version & ignored).any?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Gadget < ActiveRecord::Base
|
class Gadget < ActiveRecord::Base
|
||||||
has_paper_trail ignore: :brand
|
has_paper_trail ignore: [:brand, { color: proc { |obj| obj.color == "Yellow" } }]
|
||||||
end
|
end
|
||||||
|
|
|
@ -254,6 +254,7 @@ class SetUpTestTables < ::ActiveRecord::Migration::Current
|
||||||
create_table :gadgets, force: true do |t|
|
create_table :gadgets, force: true do |t|
|
||||||
t.string :name
|
t.string :name
|
||||||
t.string :brand
|
t.string :brand
|
||||||
|
t.string :color
|
||||||
t.timestamps null: true, limit: 6
|
t.timestamps null: true, limit: 6
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -8,12 +8,25 @@ RSpec.describe Gadget, type: :model do
|
||||||
it { is_expected.to be_versioned }
|
it { is_expected.to be_versioned }
|
||||||
|
|
||||||
describe "updates", versioning: true do
|
describe "updates", versioning: true do
|
||||||
it "generates a version for updates to `name` attribute" do
|
it "generates a version for updates" do
|
||||||
expect { gadget.update_attribute(:name, "Hammer") }.to(change { gadget.versions.size }.by(1))
|
expect { gadget.update_attribute(:name, "Hammer") }.to(change { gadget.versions.size }.by(1))
|
||||||
end
|
end
|
||||||
|
|
||||||
it "ignores for updates to `brand` attribute" do
|
context "ignored via symbol" do
|
||||||
expect { gadget.update_attribute(:brand, "Stanley") }.not_to(change { gadget.versions.size })
|
it "doesn't generate a version" do
|
||||||
|
expect { gadget.update_attribute(:brand, "Picard") }.not_to(change { gadget.versions.size })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "ignored via Hash" do
|
||||||
|
it "generates a version when the ignored attribute isn't true" do
|
||||||
|
expect { gadget.update_attribute(:color, "Blue") }.to(change { gadget.versions.size }.by(1))
|
||||||
|
expect(gadget.versions.last.changeset.keys).to eq %w[color updated_at]
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't generate a version when the ignored attribute is true" do
|
||||||
|
expect { gadget.update_attribute(:color, "Yellow") }.not_to(change { gadget.versions.size })
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "still generates a version when only the `updated_at` attribute is updated" do
|
it "still generates a version when only the `updated_at` attribute is updated" do
|
||||||
|
|
Loading…
Reference in a new issue