aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/arel/predications.rb4
-rw-r--r--lib/arel/visitors/to_sql.rb18
-rw-r--r--test/visitors/test_to_sql.rb18
3 files changed, 30 insertions, 10 deletions
diff --git a/lib/arel/predications.rb b/lib/arel/predications.rb
index 5a5c3d4495..dec4392f0f 100644
--- a/lib/arel/predications.rb
+++ b/lib/arel/predications.rb
@@ -31,7 +31,7 @@ module Arel
def in other
case other
when Arel::SelectManager
- Nodes::In.new self, other.to_a.map { |x| x.id }
+ Arel::Nodes::In.new(self, other)
when Range
if other.exclude_end?
left = Nodes::GreaterThanOrEqual.new(self, other.begin)
@@ -56,7 +56,7 @@ module Arel
def not_in other
case other
when Arel::SelectManager
- Nodes::NotIn.new self, other.to_a.map { |x| x.id }
+ Arel::Nodes::NotIn.new(self, other)
when Range
if other.exclude_end?
left = Nodes::LessThan.new(self, other.begin)
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index bd0d664b44..5446298189 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -101,6 +101,10 @@ module Arel
}.join ', '})"
end
+ def visit_Arel_SelectManager o
+ o.to_sql
+ end
+
def visit_Arel_Nodes_SelectStatement o
[
o.cores.map { |x| visit_Arel_Nodes_SelectCore x }.join,
@@ -233,17 +237,11 @@ module Arel
end
def visit_Arel_Nodes_In o
- right = o.right
- "#{visit o.left} IN (#{
- right.empty? ? 'NULL' : right.map { |x| visit x }.join(', ')
- })"
+ "#{visit o.left} IN (#{visit o.right})"
end
def visit_Arel_Nodes_NotIn o
- right = o.right
- "#{visit o.left} NOT IN (#{
- right.empty? ? 'NULL' : right.map { |x| visit x }.join(', ')
- })"
+ "#{visit o.left} NOT IN (#{visit o.right})"
end
def visit_Arel_Nodes_And o
@@ -320,6 +318,10 @@ module Arel
alias :visit_ActiveSupport_StringInquirer :visit_String
alias :visit_Class :visit_String
+ def visit_Array o
+ o.empty? ? 'NULL' : o.map { |x| visit x }.join(', ')
+ end
+
def quote value, column = nil
@connection.quote value, column
end
diff --git a/test/visitors/test_to_sql.rb b/test/visitors/test_to_sql.rb
index 09f037f75f..c49d2a6bdf 100644
--- a/test/visitors/test_to_sql.rb
+++ b/test/visitors/test_to_sql.rb
@@ -143,6 +143,15 @@ module Arel
}
end
+ it 'can handle subqueries' do
+ table = Table.new(:users)
+ subquery = table.project(:id).where(table[:name].eq('Aaron'))
+ node = @attr.in subquery
+ @visitor.accept(node).must_be_like %{
+ "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" = 'Aaron')
+ }
+ end
+
it 'uses the same column for escaping values' do
@attr = Table.new(:users)[:name]
visitor = Class.new(ToSql) do
@@ -191,6 +200,15 @@ module Arel
}
end
+ it 'can handle subqueries' do
+ table = Table.new(:users)
+ subquery = table.project(:id).where(table[:name].eq('Aaron'))
+ node = @attr.not_in subquery
+ @visitor.accept(node).must_be_like %{
+ "users"."id" NOT IN (SELECT id FROM "users" WHERE "users"."name" = 'Aaron')
+ }
+ end
+
it 'uses the same column for escaping values' do
@attr = Table.new(:users)[:name]
visitor = Class.new(ToSql) do