diff --git a/activerecord/lib/active_record/relation/spawn_methods.rb b/activerecord/lib/active_record/relation/spawn_methods.rb
index 5c3318651ae28441246073b79f6ccfad669b5629..ee509b98d4943c5a63ef9d36fb921b9446bb08ac 100644
--- a/activerecord/lib/active_record/relation/spawn_methods.rb
+++ b/activerecord/lib/active_record/relation/spawn_methods.rb
@@ -12,6 +12,7 @@ def spawn #:nodoc:
# Merges in the conditions from other, if other is an ActiveRecord::Relation.
# Returns an array representing the intersection of the resulting records with other, if other is an array.
+ #
# Post.where(published: true).joins(:comments).merge( Comment.where(spam: false) )
# # Performs a single join query with both where conditions.
#
@@ -37,11 +38,12 @@ def merge(other)
end
def merge!(other) # :nodoc:
- if !other.is_a?(Relation) && other.respond_to?(:to_proc)
+ if other.is_a?(Hash)
+ Relation::HashMerger.new(self, other).merge
+ elsif other.respond_to?(:to_proc)
instance_exec(&other)
else
- klass = other.is_a?(Hash) ? Relation::HashMerger : Relation::Merger
- klass.new(self, other).merge
+ Relation::Merger.new(self, other).merge
end
end
diff --git a/activerecord/test/cases/relation_test.rb b/activerecord/test/cases/relation_test.rb
index 8794bc8043da753fb0a74ae55e67c03fe5249be6..b58052a9620eef4d7949744419a7844b1754d9e0 100644
--- a/activerecord/test/cases/relation_test.rb
+++ b/activerecord/test/cases/relation_test.rb
@@ -24,6 +24,10 @@ def self.table_name
def self.sanitize_sql_for_order(sql)
sql
end
+
+ def self.arel_table
+ Post.arel_table
+ end
end
def test_construction