Skip to content

Commit 4d83c2a

Browse files
committed
Merge pull request rails#15434 from sgrif/sg-clear-caches
Clear all caches calculated based on `@columns` when `@columns` changes
2 parents b186718 + 6c5763b commit 4d83c2a

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

activerecord/lib/active_record/properties.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ module ClassMethods
7575
# store_listing.price_in_cents # => 1000
7676
def property(name, cast_type, options = {})
7777
name = name.to_s
78-
clear_properties_cache
78+
clear_caches_calculated_from_columns
7979
# Assign a new hash to ensure that subclasses do not share a hash
8080
self.user_provided_columns = user_provided_columns.merge(name => connection.new_column(name, options[:default], cast_type))
8181
end
@@ -92,7 +92,7 @@ def columns_hash
9292

9393
def reset_column_information # :nodoc:
9494
super
95-
clear_properties_cache
95+
clear_caches_calculated_from_columns
9696
end
9797

9898
private
@@ -108,9 +108,13 @@ def add_user_provided_columns(schema_columns)
108108
existing_columns + new_columns
109109
end
110110

111-
def clear_properties_cache
111+
def clear_caches_calculated_from_columns
112112
@columns = nil
113113
@columns_hash = nil
114+
@column_types = nil
115+
@column_defaults = nil
116+
@column_names = nil
117+
@content_columns = nil
114118
end
115119
end
116120
end

activerecord/test/cases/custom_properties_test.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,25 @@ def test_overloading_properties_does_not_change_column_order
8787
column_names = OverloadedType.column_names
8888
assert_equal %w(id overloaded_float unoverloaded_float overloaded_string_with_limit string_with_default non_existent_decimal), column_names
8989
end
90+
91+
def test_caches_are_cleared
92+
klass = Class.new(OverloadedType)
93+
94+
assert_equal 6, klass.columns.length
95+
assert_not klass.columns_hash.key?('wibble')
96+
assert_equal 6, klass.column_types.length
97+
assert_equal 6, klass.column_defaults.length
98+
assert_not klass.column_names.include?('wibble')
99+
assert_equal 5, klass.content_columns.length
100+
101+
klass.property :wibble, Type::Value.new
102+
103+
assert_equal 7, klass.columns.length
104+
assert klass.columns_hash.key?('wibble')
105+
assert_equal 7, klass.column_types.length
106+
assert_equal 7, klass.column_defaults.length
107+
assert klass.column_names.include?('wibble')
108+
assert_equal 6, klass.content_columns.length
109+
end
90110
end
91111
end

0 commit comments

Comments
 (0)