What is the proper way to validate the type when using single table inheritance (STI)?-Collection of common programming errors

I am trying to use single table inheritance for some of my models. The base model is a Tournament, and I wish to extend this to create different types of tournaments. For instance, I might want to add a SingleEliminationTournament, or a DoubleEliminationTournament, both of which would inherit from Tournament. I have 2 questions, both of them somewhat related.

1) I would like the user to be able to create tournaments with a form, and to do this they would need to select one of the subclasses. Is there a way to get all of the subclasses and use them to populate a select box or something like that?

2) Since this information is going into a form, it would be nice to be able to validate the input into type. To do this, I would like to add a validation in the Tournament class that could check to make sure the Type was valid.

Obviously, I could hard code the values into the validation and the form, but I would not like to do that. Any help would be appreciated. Thanks!

  1. You could create a directory with tournaments in them and load them with Dir.glob('app/tournaments/**/*_tournament.rb'). This gives you a nice listing all the tournament files you’ve specified. Because of convention, you can then infer the proper class name for each tournament.

    Store this list of tournament names somewhere for reference in you validations and forms.

  2. TheModel.subclasses 
    

    would give you a list of types you need to include, but only if the models are loaded at runtime. They will always be loaded in production mode. You will have to load them manually in development mode.