validates_one_of - PullRequest
       12

validates_one_of

4 голосов
/ 18 июля 2010

У меня есть таблица, которая содержит столбец для логического значения.Я хочу, чтобы была только одна строка, в которой это логическое значение могло бы быть истинным.Поддерживает ли рельсы такую ​​функцию?

Я ищу что-то вроде следующего:

Table  
id | bool_value
1  | false
2  | false
3  | true
4  | false

Ответы [ 3 ]

9 голосов
/ 18 июля 2010

Вы можете сделать это, что только подтвердит уникальность, если enabled было установлено на true и проигнорирует другие случаи (nil и false), потому что nil == false:

validates_uniqueness_of :enabled, :if => :enabled

Это должно охватывать все случаи.

Надеюсь, это поможет!

4 голосов
/ 21 июля 2010

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.

1 голос
/ 18 июля 2010

Попробуйте:

validates_each :bool_value do |record, attr, value|
  if value and Table.count(:conditions => {:bool_value => true}) > 0
    record.errors.add attr, 'There can only be one TRUE row'
  end
end

Подробнее см. Документацию ActiveRecord .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...