aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel/predications.rb
diff options
context:
space:
mode:
authorSean Griffin <sean@thoughtbot.com>2014-12-26 15:45:34 -0700
committerSean Griffin <sean@thoughtbot.com>2014-12-26 15:46:11 -0700
commitcf03bd45e39def057a2f63e42a3391b7d750dece (patch)
treefcaa683c19db80b8afcf7d6d4893d2361ca40d10 /lib/arel/predications.rb
parentbf7c7558b57a36d9997fcbf3aee00e0e493f6649 (diff)
downloadrails-cf03bd45e39def057a2f63e42a3391b7d750dece.tar.gz
rails-cf03bd45e39def057a2f63e42a3391b7d750dece.tar.bz2
rails-cf03bd45e39def057a2f63e42a3391b7d750dece.zip
Allow for handling quoted values in ranges
Since Active Record needs to eagerly cast values, we need to check for quoted infinity in our range handling
Diffstat (limited to 'lib/arel/predications.rb')
-rw-r--r--lib/arel/predications.rb20
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/arel/predications.rb b/lib/arel/predications.rb
index ec779dd40f..b05fc6f99a 100644
--- a/lib/arel/predications.rb
+++ b/lib/arel/predications.rb
@@ -25,15 +25,15 @@ module Arel
end
def between other
- if other.begin == -Float::INFINITY
- if other.end == Float::INFINITY
+ if equals_quoted?(other.begin, -Float::INFINITY)
+ if equals_quoted?(other.end, Float::INFINITY)
not_in([])
elsif other.exclude_end?
lt(other.end)
else
lteq(other.end)
end
- elsif other.end == Float::INFINITY
+ elsif equals_quoted?(other.end, Float::INFINITY)
gteq(other.begin)
elsif other.exclude_end?
gteq(other.begin).and(lt(other.end))
@@ -71,15 +71,15 @@ Passing a range to `#in` is deprecated. Call `#between`, instead.
end
def not_between other
- if other.begin == -Float::INFINITY # The range begins with negative infinity
- if other.end == Float::INFINITY
+ if equals_quoted?(other.begin, -Float::INFINITY)
+ if equals_quoted?(other.end, Float::INFINITY)
self.in([])
elsif other.exclude_end?
gteq(other.end)
else
gt(other.end)
end
- elsif other.end == Float::INFINITY
+ elsif equals_quoted?(other.end, Float::INFINITY)
lt(other.begin)
else
left = lt(other.begin)
@@ -211,5 +211,13 @@ Passing a range to `#not_in` is deprecated. Call `#not_between`, instead.
def quoted_array(others)
others.map { |v| quoted_node(v) }
end
+
+ def equals_quoted?(maybe_quoted, value)
+ if maybe_quoted.is_a?(Nodes::Quoted)
+ maybe_quoted.val == value
+ else
+ maybe_quoted == value
+ end
+ end
end
end