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:
parent
3300fdedc7
commit
fe67dfbbee
2 changed files with 24 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue