Make infinity handling symmetrical in cast and deserialize
Related: #41716, 30391e9ddba745d6bdc0b23f526ecf432dfe6adf.
This commit is contained in:
parent
bbac68d428
commit
7c67b94986
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user