Ruby on rails 使用单表继承(STI)时,验证类型的正确方法是什么?

Ruby on rails 使用单表继承(STI)时,验证类型的正确方法是什么?,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我正在尝试对我的一些模型使用单表继承。基本模型是一个锦标赛,我希望扩展它来创建不同类型的锦标赛。例如,我可能想添加一个SingleEliminationTornament,或者一个DoubleEliminationTornament,这两个都将从Tornament继承。我有两个问题,它们都有点相关 1) 我希望用户能够创建一个形式的锦标赛,要做到这一点,他们需要选择一个子类。有没有办法获取所有子类并使用它们填充选择框或类似的东西 2) 由于这些信息将进入一个表单,所以最好能够验证输入到类型中。为

我正在尝试对我的一些模型使用单表继承。基本模型是一个锦标赛,我希望扩展它来创建不同类型的锦标赛。例如,我可能想添加一个SingleEliminationTornament,或者一个DoubleEliminationTornament,这两个都将从Tornament继承。我有两个问题,它们都有点相关

1) 我希望用户能够创建一个形式的锦标赛,要做到这一点,他们需要选择一个子类。有没有办法获取所有子类并使用它们填充选择框或类似的东西

2) 由于这些信息将进入一个表单,所以最好能够验证输入到类型中。为了做到这一点,我想在锦标赛类中添加一个验证,可以检查以确保类型有效


显然,我可以将值硬编码到验证和表单中,但我不想这样做。任何帮助都将不胜感激。谢谢

您可以创建一个包含锦标赛的目录,并使用
Dir.glob('app/tournaments/***\u tournament.rb')
加载它们。这为您提供了一个很好的列表,列出了您指定的所有锦标赛文件。根据惯例,您可以推断每个锦标赛的正确类名

将此锦标赛名称列表存储在某个位置,以便在验证和表单中参考

TheModel.subclasses 

将为您提供一个需要包括的类型列表,但前提是模型是在运行时加载的。它们将始终以生产模式加载。您必须在开发模式下手动加载它们

我不是Rails专家,我不确定这是否可以被认为是干净的,但对于你问题的验证部分,这对我来说很有用:

内部锦标赛模型:

def validate_type_implemented
  klass = type.constantize rescue Object
  raise "Given type not available." unless klass.class == Class and klass <= self.class
end
def validate_type_实现
klass=type.constantize救援对象

提出“给定类型不可用”。除非klass.class==class和klass,否则这肯定不太理想,但我最终使用了这个解决方案。非常感谢。