提交 f99a6df9 编写于 作者: R Ryuta Kamizono

Merge pull request #36284 from kamipo/fix_eager_loading_with_string_joins

Fix eager loading associations with string joins not to raise NoMethodError
上级 54de9b1e
......@@ -44,8 +44,7 @@ def join_constraints(foreign_table, foreign_klass, join_type, alias_tracker)
unless others.empty?
joins.concat arel.join_sources
right = joins.last.right
right.expr.children.concat(others)
append_constraints(joins.last, others)
end
# The current table in this iteration becomes the foreign table in the next
......@@ -67,6 +66,15 @@ def fetch_arel_attribute(value)
yield value.left.is_a?(Arel::Attributes::Attribute) ? value.left : value.right
end
end
def append_constraints(join, constraints)
if join.is_a?(Arel::Nodes::StringJoin)
join_string = table.create_and(constraints.unshift(join.left))
join.left = Arel.sql(base_klass.connection.visitor.compile(join_string))
else
join.right.expr.children.concat(constraints)
end
end
end
end
end
......
......@@ -101,6 +101,17 @@ def test_loading_polymorphic_association_with_mixed_table_conditions
assert_equal [taggings(:normal_comment_rating)], rating.taggings_without_tag
end
def test_loading_association_with_string_joins
rating = Rating.first
assert_equal [taggings(:normal_comment_rating)], rating.taggings_with_no_tag
rating = Rating.preload(:taggings_with_no_tag).first
assert_equal [taggings(:normal_comment_rating)], rating.taggings_with_no_tag
rating = Rating.eager_load(:taggings_with_no_tag).first
assert_equal [taggings(:normal_comment_rating)], rating.taggings_with_no_tag
end
def test_loading_with_scope_including_joins
member = Member.first
assert_equal members(:groucho), member
......
......@@ -4,4 +4,5 @@ class Rating < ActiveRecord::Base
belongs_to :comment
has_many :taggings, as: :taggable
has_many :taggings_without_tag, -> { left_joins(:tag).where("tags.id": nil) }, as: :taggable, class_name: "Tagging"
has_many :taggings_with_no_tag, -> { joins("LEFT OUTER JOIN tags ON tags.id = taggings.tag_id").where("tags.id": nil) }, as: :taggable, class_name: "Tagging"
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册