Ответ Джона Топли на самом деле неправильный. Установка abstract_class = true в базовом классе фактически приведет к тому, что дочерние классы автоматически прекратят устанавливать свой тип. Кроме того, если вы не установите set_table_name в базовом классе, дочерние классы будут жаловаться, что их таблица не существует.
Это потому, что цель abstract_class = true - установить наследование, когда вы НЕ используете STI и хотите иметь абстрактный класс (класс, не поддерживаемый таблицей БД) в иерархии классов между ActiveRecord :: Base и один или несколько классов моделей.
Инициализация рейза - это одно решение, также добавление validates_presence_of: type к базовому классу является решением.
Обратите внимание, что если вы переопределите инициализацию, вам нужно вызвать super:
def initialize(*args)
raise "Cannot directly instantiate an AbstractUser" if self.class == AbstractUser
super
end