mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
don't rely on the columns hash to get defaults. follow-up to #17169.
This will also get the defaults from attribute definitions like: attribute :type, :string, default: "SomethingElse"
This commit is contained in:
parent
4294a7eebf
commit
72b92e8172
2 changed files with 25 additions and 7 deletions
|
@ -52,7 +52,7 @@ module ActiveRecord
|
||||||
|
|
||||||
attrs = args.first
|
attrs = args.first
|
||||||
if has_attribute?(inheritance_column)
|
if has_attribute?(inheritance_column)
|
||||||
subclass = subclass_from_attributes(attrs) || subclass_from_defaults
|
subclass = subclass_from_attributes(attrs) || subclass_from_attributes(column_defaults)
|
||||||
end
|
end
|
||||||
|
|
||||||
if subclass && subclass != self
|
if subclass && subclass != self
|
||||||
|
@ -207,12 +207,6 @@ module ActiveRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def subclass_from_defaults
|
|
||||||
if default = columns_hash[inheritance_column].default
|
|
||||||
find_sti_class(default)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def initialize_dup(other)
|
def initialize_dup(other)
|
||||||
|
|
|
@ -500,3 +500,27 @@ class InheritanceComputeTypeTest < ActiveRecord::TestCase
|
||||||
Company.reset_column_information
|
Company.reset_column_information
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class InheritanceAttributeTest < ActiveRecord::TestCase
|
||||||
|
|
||||||
|
class Company < ActiveRecord::Base
|
||||||
|
self.table_name = 'companies'
|
||||||
|
attribute :type, :string, default: "InheritanceAttributeTest::Startup"
|
||||||
|
end
|
||||||
|
|
||||||
|
class Startup < Company
|
||||||
|
end
|
||||||
|
|
||||||
|
class Empire < Company
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_inheritance_new_with_subclass_as_default
|
||||||
|
startup = Company.new # without arguments
|
||||||
|
assert_equal 'InheritanceAttributeTest::Startup', startup.type
|
||||||
|
assert_instance_of Startup, startup
|
||||||
|
|
||||||
|
empire = Company.new(type: 'InheritanceAttributeTest::Empire') # without arguments
|
||||||
|
assert_equal 'InheritanceAttributeTest::Empire', empire.type
|
||||||
|
assert_instance_of Empire, empire
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue