Methods
- abstract_class?
- base_class
- compute_type
- descends_from_active_record?
- inherited
- new
- polymorphic_name
- sti_name
Attributes
[RW] | abstract_class | Set this to Consider the following default behaviour:
However, when using
Note that in the above example, to disallow the creation of a plain |
Instance Public methods
abstract_class?()
Returns whether this class is an abstract class or not.
📝 Source code
# File activerecord/lib/active_record/inheritance.rb, line 151
def abstract_class?
defined?(@abstract_class) && @abstract_class == true
end
🔎 See on GitHub
base_class()
Returns the class descending directly from ActiveRecord::Base
, or an abstract class, if any, in the inheritance hierarchy.
If A extends ActiveRecord::Base
, A.base_class will return A. If B descends from A through some arbitrarily deep hierarchy, B.base_class will return A.
If B < A and C < B and if A is an abstract_class
then both B.base_class and C.base_class would return B as the answer since A is an abstract_class.
📝 Source code
# File activerecord/lib/active_record/inheritance.rb, line 95
def base_class
unless self < Base
raise ActiveRecordError, "#{name} doesn't belong in a hierarchy descending from ActiveRecord"
end
if superclass == Base || superclass.abstract_class?
self
else
superclass.base_class
end
end
🔎 See on GitHub
descends_from_active_record?()
Returns true
if this does not need STI type condition. Returns false
if STI type condition needs to be applied.
📝 Source code
# File activerecord/lib/active_record/inheritance.rb, line 72
def descends_from_active_record?
if self == Base
false
elsif superclass.abstract_class?
superclass.descends_from_active_record?
else
superclass == Base || !columns_hash.include?(inheritance_column)
end
end
🔎 See on GitHub
inherited(subclass)
📝 Source code
# File activerecord/lib/active_record/inheritance.rb, line 163
def inherited(subclass)
subclass.instance_variable_set(:@_type_candidates_cache, Concurrent::Map.new)
super
end
🔎 See on GitHub
new(attributes = nil, &block)
Determines if one of the attributes passed in is the inheritance column, and if the inheritance column is attr accessible, it initializes an instance of the given subclass instead of the base class.
📝 Source code
# File activerecord/lib/active_record/inheritance.rb, line 50
def new(attributes = nil, &block)
if abstract_class? || self == Base
raise NotImplementedError, "#{self} is an abstract class and cannot be instantiated."
end
if has_attribute?(inheritance_column)
subclass = subclass_from_attributes(attributes)
if subclass.nil? && base_class == self
subclass = subclass_from_attributes(column_defaults)
end
end
if subclass && subclass != self
subclass.new(attributes, &block)
else
super
end
end
🔎 See on GitHub
polymorphic_name()
📝 Source code
# File activerecord/lib/active_record/inheritance.rb, line 159
def polymorphic_name
base_class.name
end
🔎 See on GitHub
sti_name()
📝 Source code
# File activerecord/lib/active_record/inheritance.rb, line 155
def sti_name
store_full_sti_class ? name : name.demodulize
end
🔎 See on GitHub
Instance Protected methods
compute_type(type_name)
Returns the class type of the record using the current module as a prefix. So descendants of MyApp::Business::Account would appear as MyApp::Business::AccountSubclass.
📝 Source code
# File activerecord/lib/active_record/inheritance.rb, line 172
def compute_type(type_name)
if type_name.start_with?("::".freeze)
# If the type is prefixed with a scope operator then we assume that
# the type_name is an absolute reference.
ActiveSupport::Dependencies.constantize(type_name)
else
type_candidate = @_type_candidates_cache[type_name]
if type_candidate && type_constant = ActiveSupport::Dependencies.safe_constantize(type_candidate)
return type_constant
end
# Build a list of candidates to search for
candidates = []
name.scan(/::|$/) { candidates.unshift "#{$`}::#{type_name}" }
candidates << type_name
candidates.each do |candidate|
constant = ActiveSupport::Dependencies.safe_constantize(candidate)
if candidate == constant.to_s
@_type_candidates_cache[type_name] = candidate
return constant
end
end
raise NameError.new("uninitialized constant #{candidates.first}", candidates.first)
end
end
🔎 See on GitHub