Я не знаю, откуда взялась идея, что вам нужно проверить булево поле как true / false, но я видел это недавно в нескольких не связанных проектах, поэтому я начинаю задумываться, не так лимем, который где-то начался.
Это логическое поле, оно должно быть истинным или ложным.AR заботится о деталях реализации булевых значений для вас.Если вы хотите логическое поле, создайте логическое поле в базе данных.Конец истории.
Глядя на источник, вот код, который преобразует значение в логическое значение:
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 147
147: def value_to_boolean(value)
148: if value.is_a?(String) && value.blank?
149: nil
150: else
151: TRUE_VALUES.include?(value)
152: end
153: end
А вот значения, которые соответствуют их логическим аналогам:
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set
Итак, еще раз посмотрев на ваш код выше, все так, как должно быть, за исключением того, что вы ожидаете, что это неправильно.присваивая «foo» логическое значение, мы видим, что «foo» отсутствует в списке допустимых истинных значений, поэтому логическое поле по умолчанию имеет значение «false», что позже будет возвращено из его метода доступа.Логическое значение для поля по-прежнему :in => [true, false]
, поэтому модель действительна.«false» и «123» терпят неудачу по одной и той же причине.«true» является допустимым значением логического значения «true», поэтому для поля устанавливается значение «true» и все еще действует по причине, изложенной выше.