2012-02-07 110 views
2

我想为我的一些模型使用单表继承。基本模型是一个锦标赛,我希望扩展它来创建不同类型的锦标赛。例如,我可能想添加一个SingleEliminationTournament或者DoubleEliminationTournament,这两个都可以从Tournament继承。我有两个问题,两者都有些相关。使用单表继承(STI)时验证类型的正确方法是什么?

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

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

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

回答

1

您可以在其中创建一个包含锦标赛的目录并使用Dir.glob('app/tournaments/**/*_tournament.rb')加载它们。这给你一个很好的列表,你已经指定的所有比赛文件。由于惯例,你可以推断每个锦标赛的正确名字。

将此比赛名称列表存储在某处供您参考验证和表单。

+0

这绝对不是理想的,但我最终使用这种解决方案。谢谢。 – Max 2012-02-09 19:39:48

1
TheModel.subclasses 

会给你一个你需要包含的类型列表,但只有在模型在运行时被加载。它们将始终以生产模式加载。您将不得不在开发模式下手动加载它们。

0

我不是一个Rails的专家,我不知道如果这也算干净,但对于你的问题的验证部分,这个工作对我来说:

内部比赛模式:

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