From b574d283e57930105d505c2d34f6d4777dc21069 Mon Sep 17 00:00:00 2001 From: Vladimir Dementyev Date: Mon, 25 Mar 2019 18:50:27 -0400 Subject: Add saved changes helpers for store accessors --- activerecord/lib/active_record/store.rb | 22 +++++++++++++++++++++- activerecord/test/cases/store_test.rb | 11 +++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/store.rb b/activerecord/lib/active_record/store.rb index 03225668da..6fecb06897 100644 --- a/activerecord/lib/active_record/store.rb +++ b/activerecord/lib/active_record/store.rb @@ -11,7 +11,9 @@ module ActiveRecord # of the model. This is very helpful for easily exposing store keys to a form or elsewhere that's # already built around just accessing attributes on the model. # - # Every accessor comes with dirty tracking methods (+key_changed?+, +key_was+ and +key_change+). + # Every accessor comes with dirty tracking methods (+key_changed?+, +key_was+ and +key_change+) and + # methods to access the changes made during the last save (+saved_change_to_key?+, +saved_change_to_key+ and + # +key_before_last_save+). # # NOTE: There is no +key_will_change!+ method for accessors, use +store_will_change!+ instead. # @@ -155,6 +157,24 @@ module ActiveRecord prev_store, _new_store = changes[store_attribute] prev_store&.dig(key) end + + define_method("saved_change_to_#{accessor_key}?") do + return false unless saved_change_to_attribute?(store_attribute) + prev_store, new_store = saved_change_to_attribute(store_attribute) + prev_store&.dig(key) != new_store&.dig(key) + end + + define_method("saved_change_to_#{accessor_key}") do + return unless saved_change_to_attribute?(store_attribute) + prev_store, new_store = saved_change_to_attribute(store_attribute) + [prev_store&.dig(key), new_store&.dig(key)] + end + + define_method("#{accessor_key}_before_last_save") do + return unless saved_change_to_attribute?(store_attribute) + prev_store, _new_store = saved_change_to_attribute(store_attribute) + prev_store&.dig(key) + end end end diff --git a/activerecord/test/cases/store_test.rb b/activerecord/test/cases/store_test.rb index 1947868f05..91c0e959f4 100644 --- a/activerecord/test/cases/store_test.rb +++ b/activerecord/test/cases/store_test.rb @@ -136,6 +136,17 @@ class StoreTest < ActiveRecord::TestCase assert_equal ["Dallas", "Lena"], @john.partner_name_change end + test "saved changes tracking for accessors" do + @john.spouse[:name] = "Lena" + assert @john.partner_name_changed? + + @john.save! + assert_not @john.partner_name_change + assert @john.saved_change_to_partner_name? + assert_equal ["Dallas", "Lena"], @john.saved_change_to_partner_name + assert_equal "Dallas", @john.partner_name_before_last_save + end + test "object initialization with not nullable column" do assert_equal true, @john.remember_login end -- cgit v1.2.3