From 72b92e817281ddc74e587295fcaa5422cdca01f8 Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Wed, 2 Dec 2015 17:02:11 +0100 Subject: 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" --- activerecord/lib/active_record/inheritance.rb | 8 +------- activerecord/test/cases/inheritance_test.rb | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) (limited to 'activerecord') diff --git a/activerecord/lib/active_record/inheritance.rb b/activerecord/lib/active_record/inheritance.rb index a46afed7f4..e094735799 100644 --- a/activerecord/lib/active_record/inheritance.rb +++ b/activerecord/lib/active_record/inheritance.rb @@ -52,7 +52,7 @@ module ActiveRecord attrs = args.first if has_attribute?(inheritance_column) - subclass = subclass_from_attributes(attrs) || subclass_from_defaults + subclass = subclass_from_attributes(attrs) || subclass_from_attributes(column_defaults) end if subclass && subclass != self @@ -207,12 +207,6 @@ module ActiveRecord end end end - - def subclass_from_defaults - if default = columns_hash[inheritance_column].default - find_sti_class(default) - end - end end def initialize_dup(other) diff --git a/activerecord/test/cases/inheritance_test.rb b/activerecord/test/cases/inheritance_test.rb index 2ad8b30eae..03bce547da 100644 --- a/activerecord/test/cases/inheritance_test.rb +++ b/activerecord/test/cases/inheritance_test.rb @@ -500,3 +500,27 @@ class InheritanceComputeTypeTest < ActiveRecord::TestCase Company.reset_column_information 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 -- cgit v1.2.3