aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/arel/visitors/to_sql.rb
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2018-11-03 14:45:25 +0900
committerRyuta Kamizono <kamipo@gmail.com>2018-11-03 14:54:57 +0900
commit19f0f140746bfae588f145fcd89df1c8f6df3910 (patch)
treecf68ea3a89158590af474d1b66740aec452b9432 /activerecord/lib/arel/visitors/to_sql.rb
parentb858c2c76cbe66b50df81372156d4b6f6e187be1 (diff)
downloadrails-19f0f140746bfae588f145fcd89df1c8f6df3910.tar.gz
rails-19f0f140746bfae588f145fcd89df1c8f6df3910.tar.bz2
rails-19f0f140746bfae588f145fcd89df1c8f6df3910.zip
Checking boundable not only `IN` clause but also `NOT IN` clause
Diffstat (limited to 'activerecord/lib/arel/visitors/to_sql.rb')
-rw-r--r--activerecord/lib/arel/visitors/to_sql.rb12
1 files changed, 12 insertions, 0 deletions
diff --git a/activerecord/lib/arel/visitors/to_sql.rb b/activerecord/lib/arel/visitors/to_sql.rb
index 7ce26884a5..8e56fb55a2 100644
--- a/activerecord/lib/arel/visitors/to_sql.rb
+++ b/activerecord/lib/arel/visitors/to_sql.rb
@@ -579,6 +579,10 @@ module Arel # :nodoc: all
end
def visit_Arel_Nodes_In(o, collector)
+ if Array === o.right && !o.right.empty?
+ o.right.keep_if { |value| boundable?(value) }
+ end
+
if Array === o.right && o.right.empty?
collector << "1=0"
else
@@ -589,6 +593,10 @@ module Arel # :nodoc: all
end
def visit_Arel_Nodes_NotIn(o, collector)
+ if Array === o.right && !o.right.empty?
+ o.right.keep_if { |value| boundable?(value) }
+ end
+
if Array === o.right && o.right.empty?
collector << "1=1"
else
@@ -788,6 +796,10 @@ module Arel # :nodoc: all
}
end
+ def boundable?(value)
+ !value.respond_to?(:boundable?) || value.boundable?
+ end
+
def has_join_sources?(o)
o.relation.is_a?(Nodes::JoinSource) && !o.relation.right.empty?
end