validates_uniqueness_of :enabled, :if => :enabled
- хороший взлом, но у вас есть проблема с вашим дизайном, если вы распространяете один концептуальный бит истинности / фальши в нескольких записях. может допустить непоследовательность.
Давайте посмотрим на некоторые альтернативы в мире, где только один ответ может быть лучшим ответом.
Сценарий 1 : Вместо столбца is_top_answer в поле «Ответ» в другой таблице имеется поле с именем top_answer_id, ссылающееся на ответ.
class Site; has_one :top_answer, :class => :answer; end
Очевидно, что теперь может быть только один, и установка и получение становятся тривиально простыми, по сравнению с таблицами, которые требует ваш дизайн.
Сценарий 2 : Ответ имеет внешний ключ к Вопросу, и на вопрос может быть только один главный ответ. Вы можете расширить предыдущее решение, добавив top_answer_id в таблицу вопросов. Как правило, предыдущий сценарий со временем перерастет в этот.
В зависимости от ваших потребностей, вы также можете рассмотреть возможность отклонения второго логического значения как истинного в after_save (часть той же транзакции), просто установив для всех остальных значение false. Это едва ли более сложная задача, чем сканирование всей таблицы, чтобы определить, разрешено ли для текущей записи установить значение true.