@@ -25,10 +25,7 @@ def merge(other)
2525 end
2626
2727 def except ( *columns )
28- WhereClause . new (
29- predicates_except ( columns ) ,
30- binds_except ( columns ) ,
31- )
28+ WhereClause . new ( *except_predicates_and_binds ( columns ) )
3229 end
3330
3431 def or ( other )
@@ -134,20 +131,35 @@ def invert_predicate(node)
134131 end
135132 end
136133
137- def predicates_except ( columns )
138- predicates . reject do |node |
139- case node
140- when Arel ::Nodes ::Between , Arel ::Nodes ::In , Arel ::Nodes ::NotIn , Arel ::Nodes ::Equality , Arel ::Nodes ::NotEqual , Arel ::Nodes ::LessThan , Arel ::Nodes ::LessThanOrEqual , Arel ::Nodes ::GreaterThan , Arel ::Nodes ::GreaterThanOrEqual
141- subrelation = ( node . left . kind_of? ( Arel ::Attributes ::Attribute ) ? node . left : node . right )
142- columns . include? ( subrelation . name . to_s )
134+ def except_predicates_and_binds ( columns )
135+ except_binds = [ ]
136+ binds_index = 0
137+
138+ predicates = self . predicates . reject do |node |
139+ except = \
140+ case node
141+ when Arel ::Nodes ::Between , Arel ::Nodes ::In , Arel ::Nodes ::NotIn , Arel ::Nodes ::Equality , Arel ::Nodes ::NotEqual , Arel ::Nodes ::LessThan , Arel ::Nodes ::LessThanOrEqual , Arel ::Nodes ::GreaterThan , Arel ::Nodes ::GreaterThanOrEqual
142+ binds_contains = node . grep ( Arel ::Nodes ::BindParam ) . size
143+ subrelation = ( node . left . kind_of? ( Arel ::Attributes ::Attribute ) ? node . left : node . right )
144+ columns . include? ( subrelation . name . to_s )
145+ end
146+
147+ if except && binds_contains > 0
148+ ( binds_index ...( binds_index + binds_contains ) ) . each do |i |
149+ except_binds [ i ] = true
150+ end
151+
152+ binds_index += binds_contains
143153 end
154+
155+ except
144156 end
145- end
146157
147- def binds_except ( columns )
148- binds . reject do |attr |
149- columns . include? ( attr . name )
158+ binds = self . binds . reject . with_index do |_ , i |
159+ except_binds [ i ]
150160 end
161+
162+ [ predicates , binds ]
151163 end
152164
153165 def predicates_with_wrapped_sql_literals
0 commit comments