mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Extract class-finder method from instantiate
This commit is contained in:
parent
7701c6f1c0
commit
3fc2d1ebd9
1 changed files with 19 additions and 27 deletions
|
@ -1648,34 +1648,10 @@ module ActiveRecord #:nodoc:
|
|||
# single-table inheritance model that makes it possible to create
|
||||
# objects of different types from the same table.
|
||||
def instantiate(record)
|
||||
object =
|
||||
if subclass_name = record[inheritance_column]
|
||||
# No type given.
|
||||
if subclass_name.empty?
|
||||
allocate
|
||||
object = find_sti_class(record[inheritance_column]).allocate
|
||||
|
||||
# Ignore type if no column is present since it was probably
|
||||
# pulled in from a sloppy join.
|
||||
elsif !columns_hash.include?(inheritance_column)
|
||||
allocate
|
||||
|
||||
else
|
||||
begin
|
||||
compute_type(subclass_name).allocate
|
||||
rescue NameError
|
||||
raise SubclassNotFound,
|
||||
"The single-table inheritance mechanism failed to locate the subclass: '#{record[inheritance_column]}'. " +
|
||||
"This error is raised because the column '#{inheritance_column}' is reserved for storing the class in case of inheritance. " +
|
||||
"Please rename this column if you didn't intend it to be used for storing the inheritance class " +
|
||||
"or overwrite #{self.to_s}.inheritance_column to use another column for that information."
|
||||
end
|
||||
end
|
||||
else
|
||||
allocate
|
||||
end
|
||||
|
||||
object.instance_variable_set("@attributes", record)
|
||||
object.instance_variable_set("@attributes_cache", Hash.new)
|
||||
object.instance_variable_set(:'@attributes', record)
|
||||
object.instance_variable_set(:'@attributes_cache', {})
|
||||
|
||||
object.send(:_run_find_callbacks)
|
||||
object.send(:_run_initialize_callbacks)
|
||||
|
@ -1683,6 +1659,22 @@ module ActiveRecord #:nodoc:
|
|||
object
|
||||
end
|
||||
|
||||
def find_sti_class(type_name)
|
||||
if type_name.blank? || !columns_hash.include?(inheritance_column)
|
||||
self
|
||||
else
|
||||
begin
|
||||
compute_type(type_name)
|
||||
rescue NameError
|
||||
raise SubclassNotFound,
|
||||
"The single-table inheritance mechanism failed to locate the subclass: '#{type_name}'. " +
|
||||
"This error is raised because the column '#{inheritance_column}' is reserved for storing the class in case of inheritance. " +
|
||||
"Please rename this column if you didn't intend it to be used for storing the inheritance class " +
|
||||
"or overwrite #{name}.inheritance_column to use another column for that information."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Nest the type name in the same module as this class.
|
||||
# Bar is "MyApp::Business::Bar" relative to MyApp::Business::Foo
|
||||
def type_name_with_module(type_name)
|
||||
|
|
Loading…
Reference in a new issue