mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Allow for the dirty tracking to work with the aliased name of aliased attributes.
Signed-off-by: Michael Koziarski <michael@koziarski.com> [#812 state:committed]
This commit is contained in:
committed by
Michael Koziarski
parent
fcf31cb752
commit
113de01eaf
@@ -34,8 +34,10 @@ module ActiveRecord
|
||||
# person.name << 'by'
|
||||
# person.name_change # => ['uncle bob', 'uncle bobby']
|
||||
module Dirty
|
||||
DIRTY_SUFFIXES = ['_changed?', '_change', '_will_change!', '_was']
|
||||
|
||||
def self.included(base)
|
||||
base.attribute_method_suffix '_changed?', '_change', '_will_change!', '_was'
|
||||
base.attribute_method_suffix *DIRTY_SUFFIXES
|
||||
base.alias_method_chain :write_attribute, :dirty
|
||||
base.alias_method_chain :save, :dirty
|
||||
base.alias_method_chain :save!, :dirty
|
||||
@@ -44,6 +46,8 @@ module ActiveRecord
|
||||
|
||||
base.superclass_delegating_accessor :partial_updates
|
||||
base.partial_updates = true
|
||||
|
||||
base.send(:extend, ClassMethods)
|
||||
end
|
||||
|
||||
# Do any attributes have unsaved changes?
|
||||
@@ -161,5 +165,19 @@ module ActiveRecord
|
||||
old != value
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
def self.extended(base)
|
||||
base.metaclass.alias_method_chain(:alias_attribute, :dirty)
|
||||
end
|
||||
|
||||
def alias_attribute_with_dirty(new_name, old_name)
|
||||
alias_attribute_without_dirty(new_name, old_name)
|
||||
DIRTY_SUFFIXES.each do |suffix|
|
||||
module_eval <<-STR, __FILE__, __LINE__+1
|
||||
def #{new_name}#{suffix}; self.#{old_name}#{suffix}; end
|
||||
STR
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -45,6 +45,19 @@ class DirtyTest < ActiveRecord::TestCase
|
||||
assert_nil pirate.catchphrase_change
|
||||
end
|
||||
|
||||
def test_aliased_attribute_changes
|
||||
# the actual attribute here is name, title is an
|
||||
# alias setup via alias_attribute
|
||||
parrot = Parrot.new
|
||||
assert !parrot.title_changed?
|
||||
assert_nil parrot.title_change
|
||||
|
||||
parrot.name = 'Sam'
|
||||
assert parrot.title_changed?
|
||||
assert_nil parrot.title_was
|
||||
assert_equal parrot.name_change, parrot.title_change
|
||||
end
|
||||
|
||||
def test_nullable_integer_not_marked_as_changed_if_new_value_is_blank
|
||||
pirate = Pirate.new
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ class Parrot < ActiveRecord::Base
|
||||
has_and_belongs_to_many :pirates
|
||||
has_and_belongs_to_many :treasures
|
||||
has_many :loots, :as => :looter
|
||||
alias_attribute :title, :name
|
||||
end
|
||||
|
||||
class LiveParrot < Parrot
|
||||
|
||||
Reference in New Issue
Block a user