ActiveRecord::ConnectionAdapters::Column value_to_boolean(value) does not return a boolean value.

value_to_boolean(value), does not always return a boolean value, only when true.

150: def value_to_boolean(value) 151: if value.is_a?(String) && value.blank? 152: nil 153: else 154: TRUE_VALUES.include?(value) 155: end 156: end

If value is contained in TRUE_VALUES then it returns true(TrueClass). But if value is anything else it returns nil(NilClass) instead of false(FalseClass)

This does not seem consistent or expected to me since false <> nil.

Since we have TRUE_VALUES and FALSE_VALUES, I think it should be something like this.

150 def value_to_boolean(value) 151 if TRUE_VALUES.include?(value) 152 true 153 elsif FALSE_VALUES.include?(value) 154 false 155 else 156 nil 157 end 158 end

The code as it is ensures that if the column contains NULL then you get nil out. 3 way true/false/unset logic can be a little odd but I'm not sure whether it should just be completely supressed. It might also be misleading in that foo.flag == false leads you to believe that Foo.find_all_by_flag(false) would return that row, which it wouldn't if the flag is NULL. If you don't like NULLs in boolean columns, then make it a non null column (which i usually do)