我正在尝试为我的某些模型使用单表继承。基础模型是锦标赛,我希望扩展它以创建不同类型的锦标赛。例如,我可能想要添加一个SingleEliminationTournament或DoubleEliminationTournament,两者都将从Tournament继承。我有两个问题,两者都有些相关。
1)我希望用户能够使用表单创建锦标赛,为此,他们需要选择其中一个子类。有没有办法获取所有子类并使用它们来填充选择框或类似的东西?
2)由于此信息将进入表单,因此能够将输入验证为类型会更好。为此,我想在Tournament类中添加一个可以检查以确保Type有效的验证。
显然,我可以将值硬编码到验证和表单中,但我不想这样做。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:1)
您可以在其中创建包含锦标赛的目录,然后使用Dir.glob('app/tournaments/**/*_tournament.rb')
加载它们。这可以很好地列出您指定的所有锦标赛文件。由于惯例,您可以推断出每个锦标赛的正确类名。
将此锦标赛名称列表存储在某处,以供您的验证和表格参考。
答案 1 :(得分:1)
TheModel.subclasses
会为您提供需要包含的类型列表,但前提是模型是在运行时加载的。它们将始终以生产模式加载。您必须在开发模式下手动加载它们。
答案 2 :(得分:0)
我不是Rails专家,我不确定这是否可以被视为干净,但对于问题的验证部分,这对我有用:
Inside Tournament模型:
def validate_type_implemented
klass = type.constantize rescue Object
raise "Given type not available." unless klass.class == Class and klass <= self.class
end