Why is STI not a good option? You are dealing with three slightly different object types with slightly different behaviors.