diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2018-02-19 03:38:50 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2018-02-23 11:15:00 +0900 |
commit | 5d78256ee31edddf9e5deb9a50f2633482279bc3 (patch) | |
tree | 80e51a75de8f179c2b397abc79ae281130d4d2a5 /activerecord/lib/active_record/relation/predicate_builder | |
parent | 6d63b5e49a399fe246afcebad45c3c962de268fa (diff) | |
download | rails-5d78256ee31edddf9e5deb9a50f2633482279bc3.tar.gz rails-5d78256ee31edddf9e5deb9a50f2633482279bc3.tar.bz2 rails-5d78256ee31edddf9e5deb9a50f2633482279bc3.zip |
PostgreSQL: Treat infinite values in date like datetime consistently
The values infinity and -infinity are supported by both date and
timestamp types.
https://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-DATETIME-SPECIAL-TABLE
And also, it can not be known whether a value is infinity correctly
unless cast a value.
I've added `QueryAttribute#infinity?` to handle that case.
Closes #27585.
Diffstat (limited to 'activerecord/lib/active_record/relation/predicate_builder')
-rw-r--r-- | activerecord/lib/active_record/relation/predicate_builder/range_handler.rb | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/relation/predicate_builder/range_handler.rb b/activerecord/lib/active_record/relation/predicate_builder/range_handler.rb index 8d0d56db3c..44bb2c7ab6 100644 --- a/activerecord/lib/active_record/relation/predicate_builder/range_handler.rb +++ b/activerecord/lib/active_record/relation/predicate_builder/range_handler.rb @@ -16,15 +16,16 @@ module ActiveRecord def call(attribute, value) begin_bind = predicate_builder.build_bind_attribute(attribute.name, value.begin) end_bind = predicate_builder.build_bind_attribute(attribute.name, value.end) - if value.begin.respond_to?(:infinite?) && value.begin.infinite? - if value.end.respond_to?(:infinite?) && value.end.infinite? + + if begin_bind.value.infinity? + if end_bind.value.infinity? attribute.not_in([]) elsif value.exclude_end? attribute.lt(end_bind) else attribute.lteq(end_bind) end - elsif value.end.respond_to?(:infinite?) && value.end.infinite? + elsif end_bind.value.infinity? attribute.gteq(begin_bind) elsif value.exclude_end? attribute.gteq(begin_bind).and(attribute.lt(end_bind)) |