Rails STI - 防止基类实例化

Jak*_*ake 26 ruby-on-rails

在基类实例化时,Rails STI情况中是否有任何方法抛出错误?覆盖初始化将会执行此操作,但随后会逐渐减少到子类.

谢谢

Mic*_*ton 59

John Topley的答案实际上是错误的.在基类中设置abstract_class = true实际上会导致子类自动停止设置其类型.另外,除非你在基类中使用set_table_name,否则子类会抱怨它们的表不存在.

这是因为abstract_class = true的目的是在不使用STI时设置继承,并希望在ActiveRecord :: Base和一个或多个类之间的类层次结构中有一个抽象类(不由db表支持的类)模特课.

初始化raise是一个解决方案,同时将validates_presence_of:type添加到基类是一个解决方案.

注意如果你要覆盖初始化,你需要调用super:

def initialize(*args)
  raise "Cannot directly instantiate an AbstractUser" if self.class == AbstractUser
  super
end
Run Code Online (Sandbox Code Playgroud)


Jak*_*mpl -1

在初始化函数中检查该类是否为 STI 基类。

但问题是你为什么要这样做?尝试不同的设计似乎更有可能对您有帮助。