提交 6c5763b7 编写于 作者: S Sean Griffin

Clear all caches calculated based on `@columns` when `@columns` changes

上级 2c51c405
...@@ -75,7 +75,7 @@ module ClassMethods ...@@ -75,7 +75,7 @@ module ClassMethods
# store_listing.price_in_cents # => 1000 # store_listing.price_in_cents # => 1000
def property(name, cast_type, options = {}) def property(name, cast_type, options = {})
name = name.to_s name = name.to_s
clear_properties_cache clear_caches_calculated_from_columns
# Assign a new hash to ensure that subclasses do not share a hash # Assign a new hash to ensure that subclasses do not share a hash
self.user_provided_columns = user_provided_columns.merge(name => connection.new_column(name, options[:default], cast_type)) self.user_provided_columns = user_provided_columns.merge(name => connection.new_column(name, options[:default], cast_type))
end end
...@@ -92,7 +92,7 @@ def columns_hash ...@@ -92,7 +92,7 @@ def columns_hash
def reset_column_information # :nodoc: def reset_column_information # :nodoc:
super super
clear_properties_cache clear_caches_calculated_from_columns
end end
private private
...@@ -108,9 +108,13 @@ def add_user_provided_columns(schema_columns) ...@@ -108,9 +108,13 @@ def add_user_provided_columns(schema_columns)
existing_columns + new_columns existing_columns + new_columns
end end
def clear_properties_cache def clear_caches_calculated_from_columns
@columns = nil @columns = nil
@columns_hash = nil @columns_hash = nil
@column_types = nil
@column_defaults = nil
@column_names = nil
@content_columns = nil
end end
end end
end end
......
...@@ -87,5 +87,25 @@ def test_overloading_properties_does_not_change_column_order ...@@ -87,5 +87,25 @@ def test_overloading_properties_does_not_change_column_order
column_names = OverloadedType.column_names column_names = OverloadedType.column_names
assert_equal %w(id overloaded_float unoverloaded_float overloaded_string_with_limit string_with_default non_existent_decimal), column_names assert_equal %w(id overloaded_float unoverloaded_float overloaded_string_with_limit string_with_default non_existent_decimal), column_names
end end
def test_caches_are_cleared
klass = Class.new(OverloadedType)
assert_equal 6, klass.columns.length
assert_not klass.columns_hash.key?('wibble')
assert_equal 6, klass.column_types.length
assert_equal 6, klass.column_defaults.length
assert_not klass.column_names.include?('wibble')
assert_equal 5, klass.content_columns.length
klass.property :wibble, Type::Value.new
assert_equal 7, klass.columns.length
assert klass.columns_hash.key?('wibble')
assert_equal 7, klass.column_types.length
assert_equal 7, klass.column_defaults.length
assert klass.column_names.include?('wibble')
assert_equal 6, klass.content_columns.length
end
end end
end end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册