mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
parent
203db6b8c1
commit
6b18bdd00c
3 changed files with 42 additions and 0 deletions
|
@ -1,3 +1,13 @@
|
||||||
|
* Use the default inheritance `:type` when instantiating a new object.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
# In the schema, BaseModel specifies 'SubType' as the default `:type` value
|
||||||
|
subtype = BaseModel.new
|
||||||
|
assert_equals SubType, subtype.class
|
||||||
|
|
||||||
|
*Kuldeep Aggarwal*
|
||||||
|
|
||||||
* Fix `rake db:structure:dump` on Postgres when multiple schemas are used.
|
* Fix `rake db:structure:dump` on Postgres when multiple schemas are used.
|
||||||
|
|
||||||
Fixes #22346.
|
Fixes #22346.
|
||||||
|
|
|
@ -55,6 +55,8 @@ module ActiveRecord
|
||||||
subclass = subclass_from_attributes(attrs)
|
subclass = subclass_from_attributes(attrs)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
subclass ||= subclass_from_defaults
|
||||||
|
|
||||||
if subclass && subclass != self
|
if subclass && subclass != self
|
||||||
subclass.new(*args, &block)
|
subclass.new(*args, &block)
|
||||||
else
|
else
|
||||||
|
@ -201,6 +203,16 @@ module ActiveRecord
|
||||||
attribute_names.include?(inheritance_column) && (attrs.is_a?(Hash) || attrs.respond_to?(:permitted?))
|
attribute_names.include?(inheritance_column) && (attrs.is_a?(Hash) || attrs.respond_to?(:permitted?))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def subclass_from_defaults?
|
||||||
|
attribute_names.include?(inheritance_column) && columns_hash[inheritance_column].try(:default)
|
||||||
|
end
|
||||||
|
|
||||||
|
def subclass_from_defaults
|
||||||
|
if subclass_from_defaults?
|
||||||
|
find_sti_class(columns_hash[inheritance_column].default)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def subclass_from_attributes(attrs)
|
def subclass_from_attributes(attrs)
|
||||||
attrs = attrs.to_h if attrs.respond_to?(:permitted?)
|
attrs = attrs.to_h if attrs.respond_to?(:permitted?)
|
||||||
subclass_name = attrs.with_indifferent_access[inheritance_column]
|
subclass_name = attrs.with_indifferent_access[inheritance_column]
|
||||||
|
|
|
@ -478,4 +478,24 @@ class InheritanceComputeTypeTest < ActiveRecord::TestCase
|
||||||
product = Shop::Product.new(:type => phone)
|
product = Shop::Product.new(:type => phone)
|
||||||
assert product.save
|
assert product.save
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_inheritance_new_with_subclass_as_default
|
||||||
|
original_type = Company.columns_hash["type"].default
|
||||||
|
ActiveRecord::Base.connection.change_column_default :companies, :type, 'Firm'
|
||||||
|
Company.reset_column_information
|
||||||
|
# this is the case when attrs is a +Hash+, but we didn't specify the type,
|
||||||
|
# so we need default type.
|
||||||
|
firm = Company.new(firm_name: 'Shri Hans Plastic')
|
||||||
|
assert_equal 'Firm', firm.type
|
||||||
|
assert_instance_of Firm, firm
|
||||||
|
firm = Company.new # this is the case when attrs is nil
|
||||||
|
assert_equal 'Firm', firm.type
|
||||||
|
assert_instance_of Firm, firm
|
||||||
|
firm = Company.new(type: 'Client')
|
||||||
|
assert_equal 'Client', firm.type
|
||||||
|
assert_instance_of Client, firm
|
||||||
|
ensure
|
||||||
|
ActiveRecord::Base.connection.change_column_default :companies, :type, original_type
|
||||||
|
Company.reset_column_information
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue