aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation
diff options
context:
space:
mode:
authorSean Griffin <sean@thoughtbot.com>2015-01-19 15:17:43 -0700
committerSean Griffin <sean@thoughtbot.com>2015-01-19 15:19:43 -0700
commit04d1c3716b5bfa133a0b1ed937649a0829ac5f22 (patch)
tree99bf898cfe3e93eeb4a31e931d642c222bb75a0f /activerecord/lib/active_record/relation
parent50a8cdf0e2cff604b0361a370afc8becf2579d94 (diff)
downloadrails-04d1c3716b5bfa133a0b1ed937649a0829ac5f22.tar.gz
rails-04d1c3716b5bfa133a0b1ed937649a0829ac5f22.tar.bz2
rails-04d1c3716b5bfa133a0b1ed937649a0829ac5f22.zip
Fix bind value copying from subqueried relations
With the old implementation, the bind values were created, and then we search the attributes for `Relation` objects, and merge them. This completely ignores the order that the actual `where` clause will use. If all non-relation where parameters are before the relations, it will work. However, if we query on both a relation and a value, with the value coming second, it breaks. The order of the hash should not affect the final query (especially since hashes being ordered is an implementation detail)
Diffstat (limited to 'activerecord/lib/active_record/relation')
-rw-r--r--activerecord/lib/active_record/relation/predicate_builder.rb2
-rw-r--r--activerecord/lib/active_record/relation/query_methods.rb13
2 files changed, 2 insertions, 13 deletions
diff --git a/activerecord/lib/active_record/relation/predicate_builder.rb b/activerecord/lib/active_record/relation/predicate_builder.rb
index f1cb4e1bee..2860a30f99 100644
--- a/activerecord/lib/active_record/relation/predicate_builder.rb
+++ b/activerecord/lib/active_record/relation/predicate_builder.rb
@@ -41,6 +41,8 @@ module ActiveRecord
attrs, bvs = associated_predicate_builder(column_name).create_binds(value)
result[column_name] = attrs
binds += bvs
+ when Relation
+ binds += value.arel.bind_values + value.bind_values
end
end
diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb
index c3c1b6c961..c34e4bfb9b 100644
--- a/activerecord/lib/active_record/relation/query_methods.rb
+++ b/activerecord/lib/active_record/relation/query_methods.rb
@@ -949,7 +949,6 @@ module ActiveRecord
self.bind_values += bind_values
attributes = @klass.send(:expand_hash_conditions_for_aggregates, tmp_opts)
- add_relations_to_bind_values(attributes)
predicate_builder.build_from_hash(attributes)
else
@@ -1119,17 +1118,5 @@ module ActiveRecord
raise ArgumentError, "The method .#{method_name}() must contain arguments."
end
end
-
- def add_relations_to_bind_values(attributes)
- if attributes.is_a?(Hash)
- attributes.each_value do |value|
- if value.is_a?(ActiveRecord::Relation)
- self.bind_values += value.arel.bind_values + value.bind_values
- else
- add_relations_to_bind_values(value)
- end
- end
- end
- end
end
end