Как сказал Нуклеарсандвич, это ситуация, которая требует STI рельсов (наследование одной таблицы), а не полиморфных ассоциаций.
Просто чтобы подчеркнуть разницу:
1) Наследование отдельных таблиц используется, когда у вас есть разные модели, которые очень похожи друг на друга с небольшими отличиями. STI объединяет все модели в одной таблице базы данных с полями (столбцами) для всех моделей, которые используют эту таблицу. Также есть поле типа, которое указывает, к какой модели принадлежит эта запись.
Ваш случай - прекрасный пример ИППП. У вас есть модели пользователей, учеников и учителей, у них много общих полей и функций, вам просто нужно дополнительное поле для ученика и учителя.
2) Полиморфная ассоциация используется, когда у вас есть модель, которая будет связана с различными моделями. Например, представьте, что у вас есть модель «Адрес». Также у вас есть модель «Компания» и «Пользователь», обе из которых могут иметь адрес.
В вашей модели адреса вы можете указать
belongs_to :user
belongs_to :company
А затем убедитесь, что адрес принадлежит компании, чтобы не вызывать address.user и наоборот. Однако лучший способ сделать это - полиморфная ассоциация. В вашей модели адреса вы делаете
belongs_to :addressable, :polymorphic => true
и в модель своего пользователя и компании добавьте
has_one :address, :as => :addressable
Это позволяет адресной модели полиморфировать (буквально: преобразовывать во многие) свою ассоциацию и связывать с несколькими различными моделями через одну ассоциацию.