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:
parent
d238cb88a3
commit
9deb6ababe
3 changed files with 28 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue