aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/inheritance.rb12
1 files changed, 12 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/inheritance.rb b/activerecord/lib/active_record/inheritance.rb
index 8b719e0bcb..ed95b30f80 100644
--- a/activerecord/lib/active_record/inheritance.rb
+++ b/activerecord/lib/active_record/inheritance.rb
@@ -55,6 +55,8 @@ module ActiveRecord
subclass = subclass_from_attributes(attrs)
end
+ subclass ||= subclass_from_defaults
+
if subclass && subclass != self
subclass.new(*args, &block)
else
@@ -201,6 +203,16 @@ module ActiveRecord
attribute_names.include?(inheritance_column) && (attrs.is_a?(Hash) || attrs.respond_to?(:permitted?))
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)
attrs = attrs.to_h if attrs.respond_to?(:permitted?)
subclass_name = attrs.with_indifferent_access[inheritance_column]