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

时间:2012-02-07 21:14:49

标签: ruby-on-rails ruby-on-rails-3 activerecord

我正在尝试为我的某些模型使用单表继承。基础模型是锦标赛,我希望扩展它以创建不同类型的锦标赛。例如,我可能想要添加一个SingleEliminationTournament或DoubleEliminationTournament,两者都将从Tournament继承。我有两个问题,两者都有些相关。

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

2)由于此信息将进入表单,因此能够将输入验证为类型会更好。为此,我想在Tournament类中添加一个可以检查以确保Type有效的验证。

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

3 个答案:

答案 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