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

Ensure #reset_column_information clears child classes as well

I've added a redundant test for this under the attributes API as well,
as that also causes this bug to manifest through public API (and
demonstrates that calling `reset_column_information` on the child
classes would be insufficient)

Since children of a class should always share a table with their parent,
just reloading the schema from the cache should be sufficient here.
`reload_schema_from_cache` should probably become public and
`# :nodoc:`, but I'd rather avoid the git churn here.

Fixes #22057
This commit is contained in:
Sean Griffin 2015-11-07 08:17:25 -07:00
parent d238cb88a3
commit 9deb6ababe
3 changed files with 28 additions and 0 deletions

View file

@ -339,6 +339,9 @@ module ActiveRecord
@columns = nil
@columns_hash = nil
@attribute_names = nil
direct_descendants.each do |descendant|
descendant.send(:reload_schema_from_cache)
end
end
# Guesses the table name, but does not decorate it with prefix and suffix information.

View file

@ -172,5 +172,18 @@ module ActiveRecord
assert_equal int_range, klass.type_for_attribute("my_int_range")
end
end
test "attributes added after subclasses load are inherited" do
parent = Class.new(ActiveRecord::Base) do
self.table_name = "topics"
end
child = Class.new(parent)
child.new # => force a schema load
parent.attribute(:foo, Type::Value.new)
assert_equal(:bar, child.new(foo: :bar).foo)
end
end
end

View file

@ -966,4 +966,16 @@ class PersistenceTest < ActiveRecord::TestCase
widget.reset_column_information
end
end
def test_reset_column_information_resets_children
child = Class.new(Topic)
child.new # force schema to load
ActiveRecord::Base.connection.add_column(:topics, :foo, :string)
Topic.reset_column_information
assert_equal "bar", child.new(foo: :bar).foo
ensure
ActiveRecord::Base.connection.remove_column(:topics, :foo)
end
end