diff options
author | Alex Robbin <alex.robbin@meyouhealth.com> | 2015-03-26 13:26:19 -0400 |
---|---|---|
committer | Alex Robbin <alex.robbin@meyouhealth.com> | 2015-05-11 09:02:48 -0400 |
commit | cbd66b430b6553e468bcdaa94af661a2d8b69d81 (patch) | |
tree | fbd365f821265d2d3eccaa5a3908814609543f29 /activerecord/lib/active_record | |
parent | db0e649aba7135133154a35549219cffe968eaf6 (diff) | |
download | rails-cbd66b430b6553e468bcdaa94af661a2d8b69d81.tar.gz rails-cbd66b430b6553e468bcdaa94af661a2d8b69d81.tar.bz2 rails-cbd66b430b6553e468bcdaa94af661a2d8b69d81.zip |
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.
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r-- | activerecord/lib/active_record/inheritance.rb | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/activerecord/lib/active_record/inheritance.rb b/activerecord/lib/active_record/inheritance.rb index 24098f72dc..a7801963e8 100644 --- a/activerecord/lib/active_record/inheritance.rb +++ b/activerecord/lib/active_record/inheritance.rb @@ -198,14 +198,16 @@ module ActiveRecord 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 |