aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Griffin <sean@seantheprogrammer.com>2015-01-05 17:09:23 -0700
committerSean Griffin <sean@seantheprogrammer.com>2015-01-05 17:09:23 -0700
commit1ab7eba89b93135940bd4ec4d799e62cecbfd2ba (patch)
tree87b26dfc483f3a8009839e5d1ae1bad362d615b9
parent00dad0343b3aa6cf019afe3c727d4a3d95ddc383 (diff)
parent42e386173f888c5762130db8db132bc33d739e4f (diff)
downloadrails-1ab7eba89b93135940bd4ec4d799e62cecbfd2ba.tar.gz
rails-1ab7eba89b93135940bd4ec4d799e62cecbfd2ba.tar.bz2
rails-1ab7eba89b93135940bd4ec4d799e62cecbfd2ba.zip
Merge pull request #18350 from brainopia/fix_build_from_bind_values
Propagate bind_values from join in subquery
-rw-r--r--activerecord/lib/active_record/relation/query_methods.rb4
-rw-r--r--activerecord/test/cases/bind_parameter_test.rb10
2 files changed, 12 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb
index 6892cc114c..f054e17017 100644
--- a/activerecord/lib/active_record/relation/query_methods.rb
+++ b/activerecord/lib/active_record/relation/query_methods.rb
@@ -745,6 +745,9 @@ module ActiveRecord
def from!(value, subquery_name = nil) # :nodoc:
self.from_value = [value, subquery_name]
+ if value.is_a? Relation
+ self.bind_values = value.arel.bind_values + value.bind_values + bind_values
+ end
self
end
@@ -999,7 +1002,6 @@ module ActiveRecord
case opts
when Relation
name ||= 'subquery'
- self.bind_values = opts.bind_values + self.bind_values
opts.arel.as(name.to_s)
else
opts
diff --git a/activerecord/test/cases/bind_parameter_test.rb b/activerecord/test/cases/bind_parameter_test.rb
index c4634d11e2..66663b3e0e 100644
--- a/activerecord/test/cases/bind_parameter_test.rb
+++ b/activerecord/test/cases/bind_parameter_test.rb
@@ -1,9 +1,11 @@
require 'cases/helper'
require 'models/topic'
+require 'models/author'
+require 'models/post'
module ActiveRecord
class BindParameterTest < ActiveRecord::TestCase
- fixtures :topics
+ fixtures :topics, :authors, :posts
class LogListener
attr_accessor :calls
@@ -30,6 +32,12 @@ module ActiveRecord
end
if ActiveRecord::Base.connection.supports_statement_cache?
+ def test_bind_from_join_in_subquery
+ subquery = Author.joins(:thinking_posts).where(name: 'David')
+ scope = Author.from(subquery, 'authors').where(id: 1)
+ assert_equal 1, scope.count
+ end
+
def test_binds_are_logged
sub = @connection.substitute_at(@pk)
binds = [[@pk, 1]]