【问题标题】:What is the proper way to validate the type when using single table inheritance (STI)?使用单表继承 (STI) 时验证类型的正确方法是什么?
【发布时间】:2012-02-07 21:14:49
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:
    TheModel.subclasses 
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这肯定不太理想,但我最终还是使用了这个解决方案。谢谢。
      【解决方案3】:

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

      内部锦标赛模型:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        相关资源
        最近更新 更多