aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBogdan Gusiev <agresso@gmail.com>2018-09-28 11:38:15 +0300
committerBogdan Gusiev <agresso@gmail.com>2018-09-28 11:46:40 +0300
commitd76e3e12800414551ec42e17832227b820402007 (patch)
treed92fac75bea553e622d6d653461d97273e5d4149
parent2ab0df00b69335986f1116b7bea17c1ed0f52d9f (diff)
downloadrails-d76e3e12800414551ec42e17832227b820402007.tar.gz
rails-d76e3e12800414551ec42e17832227b820402007.tar.bz2
rails-d76e3e12800414551ec42e17832227b820402007.zip
Bugfix ActiveRecord::Relation#merge special case of from clause
When one relation is merged into another that has a different base class merging `from_clause` causes invalid SQL to be generated
-rw-r--r--activerecord/lib/active_record/relation/merger.rb9
-rw-r--r--activerecord/test/cases/relation/merging_test.rb4
2 files changed, 10 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/relation/merger.rb b/activerecord/lib/active_record/relation/merger.rb
index 07b16a0740..4de7465128 100644
--- a/activerecord/lib/active_record/relation/merger.rb
+++ b/activerecord/lib/active_record/relation/merger.rb
@@ -171,9 +171,7 @@ module ActiveRecord
end
def merge_clauses
- if relation.from_clause.empty? && !other.from_clause.empty?
- relation.from_clause = other.from_clause
- end
+ relation.from_clause = other.from_clause if replace_from_clause?
where_clause = relation.where_clause.merge(other.where_clause)
relation.where_clause = where_clause unless where_clause.empty?
@@ -181,6 +179,11 @@ module ActiveRecord
having_clause = relation.having_clause.merge(other.having_clause)
relation.having_clause = having_clause unless having_clause.empty?
end
+
+ def replace_from_clause?
+ relation.from_clause.empty? && !other.from_clause.empty? &&
+ relation.klass.base_class == other.klass.base_class
+ end
end
end
end
diff --git a/activerecord/test/cases/relation/merging_test.rb b/activerecord/test/cases/relation/merging_test.rb
index 6e7998d15a..224e4f39a8 100644
--- a/activerecord/test/cases/relation/merging_test.rb
+++ b/activerecord/test/cases/relation/merging_test.rb
@@ -122,6 +122,10 @@ class RelationMergingTest < ActiveRecord::TestCase
assert_not_empty relation.from_clause
end
+ def test_merging_with_from_clause_on_different_class
+ assert Comment.joins(:post).merge(Post.from("posts")).first
+ end
+
def test_merging_with_order_with_binds
relation = Post.all.merge(Post.order([Arel.sql("title LIKE ?"), "%suffix"]))
assert_equal ["title LIKE '%suffix'"], relation.order_values