1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Fixed AR::Relation#where edge case with Hash and other Relation

Example:

  Author.where(posts: { author_id: Author.where(country_id: 1) }).joins(:posts)
This commit is contained in:
Bogdan Gusiev 2014-08-14 13:44:29 +03:00
parent 3300fdedc7
commit fe67dfbbee
2 changed files with 24 additions and 3 deletions

View file

@ -952,9 +952,7 @@ WARNING
self.bind_values += bind_values
attributes = @klass.send(:expand_hash_conditions_for_aggregates, tmp_opts)
attributes.values.grep(ActiveRecord::Relation) do |rel|
self.bind_values += rel.bind_values
end
add_relations_to_bind_values(attributes)
PredicateBuilder.build_from_hash(klass, attributes, table)
else
@ -1137,5 +1135,19 @@ WARNING
raise ArgumentError, "The method .#{method_name}() must contain arguments."
end
end
# This function is recursive just for better readablity.
# #where argument doesn't support more than one level nested hash in real world.
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.bind_values
else
add_relations_to_bind_values(value)
end
end
end
end
end
end

View file

@ -61,6 +61,15 @@ module ActiveRecord
assert_equal expected.to_sql, actual.to_sql
end
def test_belongs_to_nested_where_with_relation
author = authors(:david)
expected = Author.where(id: author ).joins(:posts)
actual = Author.where(posts: { author_id: Author.where(id: author.id) }).joins(:posts)
assert_equal expected.to_a, actual.to_a
end
def test_polymorphic_shallow_where
treasure = Treasure.new
treasure.id = 1