diff options
author | Yves Senn <yves.senn@gmail.com> | 2015-12-02 13:31:20 +0100 |
---|---|---|
committer | Yves Senn <yves.senn@gmail.com> | 2015-12-02 13:39:30 +0100 |
commit | 3da890f891b116218c10d9b049dba23d15d416cf (patch) | |
tree | 343746a950fa80b31866c6b2813a0d4828f25a76 /activerecord/lib | |
parent | 203db6b8c11532eb99e2770dbba326579532aa37 (diff) | |
parent | 6b18bdd00ce1e8eb4a5a30f0f6152e47da9bec42 (diff) | |
download | rails-3da890f891b116218c10d9b049dba23d15d416cf.tar.gz rails-3da890f891b116218c10d9b049dba23d15d416cf.tar.bz2 rails-3da890f891b116218c10d9b049dba23d15d416cf.zip |
Merge pull request #17169 from kuldeepaggarwal/fix-STI-default-type
STI cast new instances to `default type` on initialize.
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record/inheritance.rb | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/activerecord/lib/active_record/inheritance.rb b/activerecord/lib/active_record/inheritance.rb index 8b719e0bcb..4ae9920efb 100644 --- a/activerecord/lib/active_record/inheritance.rb +++ b/activerecord/lib/active_record/inheritance.rb @@ -51,8 +51,8 @@ module ActiveRecord end attrs = args.first - if subclass_from_attributes?(attrs) - subclass = subclass_from_attributes(attrs) + if attribute_names.include?(inheritance_column) + subclass = subclass_from_attributes(attrs) || subclass_from_defaults end if subclass && subclass != self @@ -197,16 +197,20 @@ module ActiveRecord # is not self or a valid subclass, raises ActiveRecord::SubclassNotFound # If this is a StrongParameters hash, and access to inheritance_column is not permitted, # this will ignore the inheritance column and return nil - def subclass_from_attributes?(attrs) - attribute_names.include?(inheritance_column) && (attrs.is_a?(Hash) || attrs.respond_to?(:permitted?)) - end - def subclass_from_attributes(attrs) attrs = attrs.to_h if attrs.respond_to?(:permitted?) - subclass_name = attrs.with_indifferent_access[inheritance_column] + if attrs.is_a?(Hash) + subclass_name = attrs.with_indifferent_access[inheritance_column] + + if subclass_name.present? + find_sti_class(subclass_name) + end + end + end - if subclass_name.present? - find_sti_class(subclass_name) + def subclass_from_defaults + if default = columns_hash[inheritance_column].default + find_sti_class(default) end end end |