1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Support beginless ranges in hash conditions.

Ruby 2.7 introduces beginless ranges (..value and ...value) and as with
endless ranges we can turn these into inequalities, enabling expressions
such as

    Order.where(created_at: ..1.year.ago)
    User.where(karma: ...0)
This commit is contained in:
Josh Goodall 2019-07-17 15:18:54 +10:00
parent 32e5f9049c
commit b19150448b
3 changed files with 30 additions and 2 deletions

View file

@ -1,3 +1,7 @@
* Add support for beginless ranges, introduced in Ruby 2.7.
*Josh Goodall*
* Add database_exists? method to connection adapters to check if a database exists.
*Guilherme Mansur*

View file

@ -37,7 +37,7 @@ module Arel # :nodoc: all
def between(other)
if unboundable?(other.begin) == 1 || unboundable?(other.end) == -1
self.in([])
elsif open_ended?(other.begin)
elsif other.begin.nil? || open_ended?(other.begin)
if other.end.nil? || open_ended?(other.end)
not_in([])
elsif other.exclude_end?
@ -85,7 +85,7 @@ Passing a range to `#in` is deprecated. Call `#between`, instead.
def not_between(other)
if unboundable?(other.begin) == 1 || unboundable?(other.end) == -1
not_in([])
elsif open_ended?(other.begin)
elsif other.begin.nil? || open_ended?(other.begin)
if other.end.nil? || open_ended?(other.end)
self.in([])
elsif other.exclude_end?

View file

@ -638,6 +638,18 @@ module Arel
)
end
if Gem::Version.new("2.7.0") <= Gem::Version.new(RUBY_VERSION)
it "can be constructed with a range implicitly starting at Infinity" do
attribute = Attribute.new nil, nil
node = attribute.between(eval("..0")) # eval for backwards compatibility
node.must_equal Nodes::LessThanOrEqual.new(
attribute,
Nodes::Casted.new(0, attribute)
)
end
end
if Gem::Version.new("2.6.0") <= Gem::Version.new(RUBY_VERSION)
it "can be constructed with a range implicitly ending at Infinity" do
attribute = Attribute.new nil, nil
@ -839,6 +851,18 @@ module Arel
)
end
if Gem::Version.new("2.7.0") <= Gem::Version.new(RUBY_VERSION)
it "can be constructed with a range implicitly starting at Infinity" do
attribute = Attribute.new nil, nil
node = attribute.not_between(eval("..0")) # eval for backwards compatibility
node.must_equal Nodes::GreaterThan.new(
attribute,
Nodes::Casted.new(0, attribute)
)
end
end
if Gem::Version.new("2.6.0") <= Gem::Version.new(RUBY_VERSION)
it "can be constructed with a range implicitly ending at Infinity" do
attribute = Attribute.new nil, nil