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



我正在尝试对我的一些模型使用单表继承。基础模型是锦标赛,我希望将其扩展到创建不同类型的锦标赛。例如,我可能想添加一个单淘汰赛或双淘汰赛,这两个都将继承自锦标赛。我有两个问题,这两个问题都有些关联。

1) 我希望用户能够用表单创建锦标赛,要做到这一点,他们需要选择其中一个子类。有没有一种方法可以获得所有的子类,并使用它们来填充一个选择框或类似的东西?

2) 由于这些信息将进入一个表单,因此能够将输入验证为类型将是一件好事。要做到这一点,我想在Tournament类中添加一个验证,它可以检查以确保Type有效。

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

TheModel.subclasses 

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

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

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

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

内部锦标赛模型:

def validate_type_implemented
  klass = type.constantize rescue Object
  raise "Given type not available." unless klass.class == Class and klass <= self.class
end

最新更新