Не могли бы вы иметь логическое поле для head_coach и assistant_coach в своей таблице участников и использовать проверочное уникальное правило с областью действия.
EG
Добавить в таблицу участников
is_head_coach:boolean
is_assistant_coach:boolean
Теперь в вашей модели участника есть
validates_uniqueness_of :is_head_coach, :scope => [:team_id, :person_id]
validates_uniqueness_of :is_assistant_coach, :scope => [:team_id, :person_id]
Тогда вы могли бы использовать несколько именованных областей в модели человека или команды, чтобы найти head_coach.
Что касается перечисления всех позиций, которые вы не могли использовать:
@team.members.each do |member|
"#{member.person.name} #{member.position}"
Если вы хотите отсортировать их определенным образом, возможно, вы могли бы добавить поле с именем sort_order: integer к таблице членов и отсортировать по нему.
Обновление:
Я понимаю, что приведенное выше решение не является масштабируемым. Как насчет того, чтобы использовать поле позиции в модели члена и создать для него область видимости, называемую «область действия», например:
scope :head_coach, lambda { where('position = 'head coach') }
Тогда вы можете использовать что-то вроде:
team.members.head_coach
Вы можете пойти еще дальше с этой областью
scope :get_position, lambda{|pos| where('position = ?', pos)}
и используйте
team.members.get_position('head_coach')
Вы могли бы написать собственный метод проверки, чтобы проверить, что вы в конечном итоге используете head_coach для каждой команды и т. Д.