aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/type_caster/connection.rb
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2019-05-21 15:00:41 +0900
committerRyuta Kamizono <kamipo@gmail.com>2019-05-21 23:41:13 +0900
commit82a54be0c6a19336008e18f52bc76791adc3bd67 (patch)
tree801e0ffb599536daa8bf7f331a2ef9994d54159c /activerecord/lib/active_record/type_caster/connection.rb
parent0810c076de0d9b7879ee240bb08d31fb7c2f5ac9 (diff)
downloadrails-82a54be0c6a19336008e18f52bc76791adc3bd67.tar.gz
rails-82a54be0c6a19336008e18f52bc76791adc3bd67.tar.bz2
rails-82a54be0c6a19336008e18f52bc76791adc3bd67.zip
Fall back to type casting from the connection adapter
Unfortunately, a11a8ff had no effect as long as using bind param, and was not tested. This ensures making the intent of a11a8ff, which fall back to type casting from the connection adapter. Fixes #35205. ``` % ARCONN=postgresql bundle exec ruby -w -Itest test/cases/relation/where_test.rb -n test_type_casting_nested_joins Using postgresql Run options: -n test_type_casting_nested_joins --seed 55730 # Running: E Error: ActiveRecord::WhereTest#test_type_casting_nested_joins: ActiveRecord::StatementInvalid: PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: "2-foo" rails test test/cases/relation/where_test.rb:30 Finished in 0.245778s, 4.0687 runs/s, 0.0000 assertions/s. 1 runs, 0 assertions, 0 failures, 1 errors, 0 skips ```
Diffstat (limited to 'activerecord/lib/active_record/type_caster/connection.rb')
-rw-r--r--activerecord/lib/active_record/type_caster/connection.rb26
1 files changed, 16 insertions, 10 deletions
diff --git a/activerecord/lib/active_record/type_caster/connection.rb b/activerecord/lib/active_record/type_caster/connection.rb
index 7cf8181d8e..f43559f4cb 100644
--- a/activerecord/lib/active_record/type_caster/connection.rb
+++ b/activerecord/lib/active_record/type_caster/connection.rb
@@ -8,21 +8,27 @@ module ActiveRecord
@table_name = table_name
end
- def type_cast_for_database(attribute_name, value)
+ def type_cast_for_database(attr_name, value)
return value if value.is_a?(Arel::Nodes::BindParam)
- column = column_for(attribute_name)
- connection.type_cast_from_column(column, value)
+ type = type_for_attribute(attr_name)
+ type.serialize(value)
end
- private
- attr_reader :table_name
- delegate :connection, to: :@klass
+ def type_for_attribute(attr_name)
+ schema_cache = connection.schema_cache
- def column_for(attribute_name)
- if connection.schema_cache.data_source_exists?(table_name)
- connection.schema_cache.columns_hash(table_name)[attribute_name.to_s]
- end
+ if schema_cache.data_source_exists?(table_name)
+ column = schema_cache.columns_hash(table_name)[attr_name.to_s]
+ type = connection.lookup_cast_type_from_column(column) if column
end
+
+ type || Type.default_value
+ end
+
+ delegate :connection, to: :@klass, private: true
+
+ private
+ attr_reader :table_name
end
end
end