Я бы использовал именованную область видимости, чтобы найти активного лектора.
class Person
named_scope :currently_speaking, :conditions => {:active => true}
end
Тогда я бы назвал это лектором в ClassRoom:
class ClassRoom
def lecturer
people.currently_speaking.first
end
end
Настоящая проблема заключается в том, чтобы при активации кого-то другого он становился единственным активным человеком. Я мог бы сделать это так:
class Person
belongs_to :class_room
before_save :ensure_one_lecturer
def activate!
self.active = true
save
end
def ensure_one_lecturer
if self.active && changed.has_key?(:active)
class_room.lecturer.update_attribute(:active, false)
end
end
end
Таким образом, все делается в транзакции, только если вы изменили активное состояние, и должно быть довольно легко протестировано (я не проверял это).