Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fix bug when Column is trying to type cast boolean values to integer.

This can occur if the user is using :integer columns to store boolean
values. Now we are handling the boolean values but it still raises if
the value can't type cast to integer and is not a boolean. See #7509.

Fixes #8067.
  • Loading branch information...
commit 96a13fc7de77d7e5cdadb2857b94c4e859174faa 1 parent e6b4184
@rafaelfranca rafaelfranca authored
5 activerecord/CHANGELOG.md
@@ -1,5 +1,10 @@
## Rails 3.2.9 (unreleased)
+* Fix bug when Column is trying to type cast boolean values to integer.
+ Fixes #8067.
+
+ *Rafael Mendonça França*
+
* Fixed support for DATABASE_URL environment variable for rake db tasks. *Grace Liu*
* Fix bug where `update_columns` and `update_column` would not let you update the primary key column.
View
15 activerecord/lib/active_record/connection_adapters/column.rb
@@ -75,7 +75,7 @@ def type_cast(value)
case type
when :string, :text then value
- when :integer then value.to_i
+ when :integer then klass.value_to_integer(value)
when :float then value.to_f
when :decimal then klass.value_to_decimal(value)
when :datetime, :timestamp then klass.string_to_time(value)
@@ -92,7 +92,7 @@ def type_cast_code(var_name)
case type
when :string, :text then var_name
- when :integer then "(#{var_name}.to_i)"
+ when :integer then "#{klass}.value_to_integer(#{var_name})"
when :float then "#{var_name}.to_f"
when :decimal then "#{klass}.value_to_decimal(#{var_name})"
when :datetime, :timestamp then "#{klass}.string_to_time(#{var_name})"
@@ -168,6 +168,17 @@ def value_to_boolean(value)
end
end
+ # Used to convert values to integer.
+ # handle the case when an integer column is used to store bollean values
@frodsan
frodsan added a note

typo => boolean

@rafaelfranca Owner

:bomb:. I'll fix in a second

@frodsan
frodsan added a note

:+1: powered by RafaLint™

@rafaelfranca Owner

lol. My lint algorithm is getting slower

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ def value_to_integer(value)
+ case value
+ when TrueClass, FalseClass
+ value ? 1 : 0
+ else
+ value.to_i
+ end
+ end
+
# convert something to a BigDecimal
def value_to_decimal(value)
# Using .class is faster than .is_a? and
View
8 activerecord/test/cases/column_test.rb
@@ -33,6 +33,8 @@ def test_type_cast_integer
assert_equal 0, column.type_cast('bad1')
assert_equal 0, column.type_cast('bad')
assert_equal 1, column.type_cast(1.7)
+ assert_equal 0, column.type_cast(false)
+ assert_equal 1, column.type_cast(true)
assert_nil column.type_cast(nil)
end
@@ -41,11 +43,9 @@ def test_type_cast_non_integer_to_integer
assert_raises(NoMethodError) do
column.type_cast([])
end
+
assert_raises(NoMethodError) do
- column.type_cast(true)
- end
- assert_raises(NoMethodError) do
- column.type_cast(false)
+ column.type_cast(Object.new)
end
end
end
Something went wrong with that request. Please try again.