Make infinity handling symmetrical in cast and deserialize

Related: #41716, 30391e9ddba745d6bdc0b23f526ecf432dfe6adf.
This commit is contained in:
Ryuta Kamizono 2021-03-22 15:20:50 +09:00
parent bbac68d428
commit 7c67b94986
2 changed files with 7 additions and 3 deletions

@ -19,14 +19,14 @@ def cast(value)
if value.is_a?(Hash)
set_time_zone_without_conversion(super)
elsif value == ::Float::INFINITY || value == -::Float::INFINITY
value
elsif value.respond_to?(:in_time_zone)
begin
super(user_input_in_time_zone(value)) || super
rescue ArgumentError
nil
end
elsif value.respond_to?(:infinite?) && value.infinite?
value
else
map_avoiding_infinite_recursion(super) { |v| cast(v) }
end
@ -38,7 +38,7 @@ def convert_time_to_time_zone(value)
if value.acts_like?(:time)
value.in_time_zone
elsif value.is_a?(::Float)
elsif value.respond_to?(:infinite?) && value.infinite?
value
else
map_avoiding_infinite_recursion(value) { |v| convert_time_to_time_zone(v) }

@ -82,6 +82,10 @@ class PostgresqlInfinity < ActiveRecord::Base
record = PostgresqlInfinity.create!(datetime: Float::INFINITY)
assert_equal Float::INFINITY, record.datetime
assert_equal record.datetime, record.reload.datetime
record = PostgresqlInfinity.create!(datetime: BigDecimal::INFINITY)
assert_equal Float::INFINITY, record.datetime
assert_equal record.datetime, record.reload.datetime
end
ensure
# setting time_zone_aware_attributes causes the types to change.