attribute abstract_class

Ruby on Rails edge

Since v3.2.22.5

Available in: v3.2.22.5 v4.0.13 v4.1.16 v4.2.11.3 v5.0.7.2 v5.1.7 v5.2.8.1 v6.0.6.1 v6.1.7.10 v7.0.10 v7.1.6 v7.2.4 v8.0.5.1 v8.1.4 edge

Set 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.

Type at least 2 characters to search.

Use the arrow keys to navigate results, Enter to open one, Escape to close.

Keyboard shortcuts

/
Focus search
⌘K / Ctrl-K
Command palette
?
This help
Esc
Close