attribute abstract_class
Ruby on Rails edge
Since v3.2.22.5Set this to true if this is an abstract class (see abstract_class?). If you are using inheritance with Active Record and don’t want a class to be considered as part of the STI hierarchy, you must set this to true. ApplicationRecord, for example, is generated as an abstract class.
Consider the following default behavior:
“‘ Shape = Class.new(ActiveRecord::Base) Polygon = Class.new(Shape) Square = Class.new(Polygon)
Shape.table_name # => “shapes” Polygon.table_name # => “shapes” Square.table_name # => “shapes” Shape.create! # => #<Shape id: 1, type: nil> Polygon.create! # => #<Polygon id: 2, type: “Polygon”> Square.create! # => #<Square id: 3, type: “Square”> “‘
However, when using abstract_class, Shape is omitted from the hierarchy:
“‘ class Shape < ActiveRecord::Base
self.abstract_class = true
end Polygon = Class.new(Shape) Square = Class.new(Polygon)
Shape.table_name # => nil Polygon.table_name # => “polygons” Square.table_name # => “polygons” Shape.create! # => NotImplementedError: Shape is an abstract class and cannot be instantiated. Polygon.create! # => #<Polygon id: 1, type: nil> Square.create! # => #<Square id: 2, type: “Square”> “‘
Note that in the above example, to disallow the creation of a plain Polygon, you should use ‘validates :type, presence: true`, instead of setting it as an abstract class. This way, Polygon will stay in the hierarchy, and Active Record will continue to correctly derive the table name.