diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2019-05-21 15:00:41 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2019-05-21 23:41:13 +0900 |
commit | 82a54be0c6a19336008e18f52bc76791adc3bd67 (patch) | |
tree | 801e0ffb599536daa8bf7f331a2ef9994d54159c /activerecord/lib/active_record/type_caster/connection.rb | |
parent | 0810c076de0d9b7879ee240bb08d31fb7c2f5ac9 (diff) | |
download | rails-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.rb | 26 |
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 |