提交 cbd66b43 编写于 作者: A Alex Robbin

allow setting of a demodulized class name when using STI

If your STI class looks like this:

```ruby
class Company < ActiveRecord::Base
  self.store_full_sti_class = false

  class GoodCo < Company
  end

  class BadCo < Company
  end
end
```

The expectation (which is valid) is that the `type` in the database is saved as
`GoodCo` or `BadCo`. However, another expectation should be that setting `type`
to `GoodCo` would correctly instantiate the object as a `Company::GoodCo`. That
second expectation is what this should fix.
上级 db0e649a
* Allow setting of a demodulized class name whenusing single table inheritance.
*Alex Robbin*
* Dump indexes in `create_table` instead of `add_index`.
If the adapter supports indexes in create table, generated SQL is
......
......@@ -198,14 +198,16 @@ def subclass_from_attributes?(attrs)
def subclass_from_attributes(attrs)
subclass_name = attrs.with_indifferent_access[inheritance_column]
if subclass_name.present? && subclass_name != self.name
subclass = subclass_name.safe_constantize
if subclass_name.present?
subclass = find_sti_class(subclass_name)
unless descendants.include?(subclass)
raise ActiveRecord::SubclassNotFound.new("Invalid single-table inheritance type: #{subclass_name} is not a subclass of #{name}")
end
if subclass.name != self.name
unless descendants.include?(subclass)
raise ActiveRecord::SubclassNotFound.new("Invalid single-table inheritance type: #{subclass_name} is not a subclass of #{name}")
end
subclass
subclass
end
end
end
end
......
......@@ -217,6 +217,14 @@ def test_new_with_complex_inheritance
assert_nothing_raised { Client.new(type: 'VerySpecialClient') }
end
def test_new_without_storing_full_sti_class
without_store_full_sti_class do
Company::SpecialCo # force autoloading
item = Company.new(type: 'SpecialCo')
assert_instance_of Company::SpecialCo, item
end
end
def test_new_with_autoload_paths
path = File.expand_path('../../models/autoloadable', __FILE__)
ActiveSupport::Dependencies.autoload_paths << path
......
......@@ -26,6 +26,9 @@ def arbitrary_method
def private_method
"I am Jack's innermost fears and aspirations"
end
class SpecialCo < Company
end
end
module Namespaced
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册