1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add *_previously_was attribute methods when dirty tracking (#36836)

This commit is contained in:
David Heinemeier Hansson 2019-08-01 15:38:03 -07:00 committed by GitHub
parent 603cd18b0b
commit a0bb19fbfa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 1 deletions

View file

@ -1,3 +1,9 @@
* Add *_previously_was attribute methods when dirty tracking. Example:
pirate.update(catchphrase: "Ahoy!")
pirate.previous_changes["catchphrase"] # => ["Thar She Blows!", "Ahoy!"]
pirate.catchphrase_previously_was # => "Thar She Blows!"
*DHH*
Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activemodel/CHANGELOG.md) for previous changes. Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activemodel/CHANGELOG.md) for previous changes.

View file

@ -84,6 +84,7 @@ module ActiveModel
# person.previous_changes # => {"name" => [nil, "Bill"]} # person.previous_changes # => {"name" => [nil, "Bill"]}
# person.name_previously_changed? # => true # person.name_previously_changed? # => true
# person.name_previous_change # => [nil, "Bill"] # person.name_previous_change # => [nil, "Bill"]
# person.name_previously_was # => nil
# person.reload! # person.reload!
# person.previous_changes # => {} # person.previous_changes # => {}
# #
@ -122,7 +123,7 @@ module ActiveModel
included do included do
attribute_method_suffix "_changed?", "_change", "_will_change!", "_was" attribute_method_suffix "_changed?", "_change", "_will_change!", "_was"
attribute_method_suffix "_previously_changed?", "_previous_change" attribute_method_suffix "_previously_changed?", "_previous_change", "_previously_was"
attribute_method_affix prefix: "restore_", suffix: "!" attribute_method_affix prefix: "restore_", suffix: "!"
end end
@ -180,6 +181,11 @@ module ActiveModel
mutations_before_last_save.changed?(attr_name.to_s) mutations_before_last_save.changed?(attr_name.to_s)
end end
# Dispatch target for <tt>*_previously_was</tt> attribute methods.
def attribute_previously_was(attr_name) # :nodoc:
mutations_before_last_save.original_value(attr_name.to_s)
end
# Restore all previous data of the provided attributes. # Restore all previous data of the provided attributes.
def restore_attributes(attr_names = changed) def restore_attributes(attr_names = changed)
attr_names.each { |attr_name| restore_attribute!(attr_name) } attr_names.each { |attr_name| restore_attribute!(attr_name) }

View file

@ -491,6 +491,7 @@ class DirtyTest < ActiveRecord::TestCase
assert_equal 4, pirate.previous_changes.size assert_equal 4, pirate.previous_changes.size
assert_equal [nil, "arrr"], pirate.previous_changes["catchphrase"] assert_equal [nil, "arrr"], pirate.previous_changes["catchphrase"]
assert_equal nil, pirate.catchphrase_previously_was
assert_equal [nil, pirate.id], pirate.previous_changes["id"] assert_equal [nil, pirate.id], pirate.previous_changes["id"]
assert_nil pirate.previous_changes["updated_on"][0] assert_nil pirate.previous_changes["updated_on"][0]
assert_not_nil pirate.previous_changes["updated_on"][1] assert_not_nil pirate.previous_changes["updated_on"][1]
@ -507,6 +508,7 @@ class DirtyTest < ActiveRecord::TestCase
assert_equal 4, pirate.previous_changes.size assert_equal 4, pirate.previous_changes.size
assert_equal [nil, "arrr"], pirate.previous_changes["catchphrase"] assert_equal [nil, "arrr"], pirate.previous_changes["catchphrase"]
assert_equal nil, pirate.catchphrase_previously_was
assert_equal [nil, pirate.id], pirate.previous_changes["id"] assert_equal [nil, pirate.id], pirate.previous_changes["id"]
assert_includes pirate.previous_changes, "updated_on" assert_includes pirate.previous_changes, "updated_on"
assert_includes pirate.previous_changes, "created_on" assert_includes pirate.previous_changes, "created_on"
@ -525,6 +527,7 @@ class DirtyTest < ActiveRecord::TestCase
assert_equal 2, pirate.previous_changes.size assert_equal 2, pirate.previous_changes.size
assert_equal ["arrr", "Me Maties!"], pirate.previous_changes["catchphrase"] assert_equal ["arrr", "Me Maties!"], pirate.previous_changes["catchphrase"]
assert_equal "arrr", pirate.catchphrase_previously_was
assert_not_nil pirate.previous_changes["updated_on"][0] assert_not_nil pirate.previous_changes["updated_on"][0]
assert_not_nil pirate.previous_changes["updated_on"][1] assert_not_nil pirate.previous_changes["updated_on"][1]
assert_not pirate.previous_changes.key?("parrot_id") assert_not pirate.previous_changes.key?("parrot_id")
@ -539,6 +542,7 @@ class DirtyTest < ActiveRecord::TestCase
assert_equal 2, pirate.previous_changes.size assert_equal 2, pirate.previous_changes.size
assert_equal ["Me Maties!", "Thar She Blows!"], pirate.previous_changes["catchphrase"] assert_equal ["Me Maties!", "Thar She Blows!"], pirate.previous_changes["catchphrase"]
assert_equal "Me Maties!", pirate.catchphrase_previously_was
assert_not_nil pirate.previous_changes["updated_on"][0] assert_not_nil pirate.previous_changes["updated_on"][0]
assert_not_nil pirate.previous_changes["updated_on"][1] assert_not_nil pirate.previous_changes["updated_on"][1]
assert_not pirate.previous_changes.key?("parrot_id") assert_not pirate.previous_changes.key?("parrot_id")
@ -551,6 +555,7 @@ class DirtyTest < ActiveRecord::TestCase
assert_equal 2, pirate.previous_changes.size assert_equal 2, pirate.previous_changes.size
assert_equal ["Thar She Blows!", "Ahoy!"], pirate.previous_changes["catchphrase"] assert_equal ["Thar She Blows!", "Ahoy!"], pirate.previous_changes["catchphrase"]
assert_equal "Thar She Blows!", pirate.catchphrase_previously_was
assert_not_nil pirate.previous_changes["updated_on"][0] assert_not_nil pirate.previous_changes["updated_on"][0]
assert_not_nil pirate.previous_changes["updated_on"][1] assert_not_nil pirate.previous_changes["updated_on"][1]
assert_not pirate.previous_changes.key?("parrot_id") assert_not pirate.previous_changes.key?("parrot_id")
@ -563,6 +568,7 @@ class DirtyTest < ActiveRecord::TestCase
assert_equal 2, pirate.previous_changes.size assert_equal 2, pirate.previous_changes.size
assert_equal ["Ahoy!", "Ninjas suck!"], pirate.previous_changes["catchphrase"] assert_equal ["Ahoy!", "Ninjas suck!"], pirate.previous_changes["catchphrase"]
assert_equal "Ahoy!", pirate.catchphrase_previously_was
assert_not_nil pirate.previous_changes["updated_on"][0] assert_not_nil pirate.previous_changes["updated_on"][0]
assert_not_nil pirate.previous_changes["updated_on"][1] assert_not_nil pirate.previous_changes["updated_on"][1]
assert_not pirate.previous_changes.key?("parrot_id") assert_not pirate.previous_changes.key?("parrot_id")