Rails STI - предотвращение создания базового класса - PullRequest
24 голосов
/ 17 мая 2010

Есть ли способ в ситуации Rails STI выдать ошибку, когда базовый класс создан? Переопределение инициализации будет делать это, но затем это относится к подклассам.

Спасибо

Ответы [ 5 ]

56 голосов
/ 29 января 2011

Ответ Джона Топли на самом деле неправильный. Установка 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
4 голосов
/ 17 мая 2010

Вы можете попробовать это:

class BaseClass
  def initialize
    raise "BaseClass cannot be initialized" if self.class == BaseClass
  end
end

class ChildClass
end

результат будет:

a = BaseClass.new  # Runtime Error
b = ChildClass.new # Ok

Надеюсь, что поможет

1 голос
/ 23 января 2018

Я часто предпочитаю просто сделать метод класса new приватным с:

class Base
  private_class_method :new 
end

Таким образом, случайное создание экземпляра базового класса вызывает ошибку, но все еще возможно создать его с помощью Base.send(:new) для написания тестов для базового класса.

0 голосов
/ 17 мая 2010

Вы можете сделать self.abstract_class = true в базовом классе, чтобы сообщить ActiveRecord, что это абстрактный класс.

0 голосов
/ 17 мая 2010

В функции инициализации проверьте, что класс является базовым классом STI.

Хотя вопрос в том, зачем вам это делать? Кажется более вероятным, что использование другого дизайна может помочь вам больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...