diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb index 4705f129f23e7..0f39e436fd850 100644 --- a/activerecord/lib/active_record/core.rb +++ b/activerecord/lib/active_record/core.rb @@ -228,7 +228,8 @@ def ===(object) # scope :published_and_commented, -> { published.and(self.arel_table[:comments_count].gt(0)) } # end def arel_table # :nodoc: - @arel_table ||= Arel::Table.new(table_name, type_caster: type_caster) + Thread.current[:"#{self.name}.arel_table"] ||= + Arel::Table.new(table_name, type_caster: type_caster) end # Returns the Arel engine. diff --git a/activerecord/test/cases/core_test.rb b/activerecord/test/cases/core_test.rb index 3cb98832c5ca9..2ece8c2314ceb 100644 --- a/activerecord/test/cases/core_test.rb +++ b/activerecord/test/cases/core_test.rb @@ -109,4 +109,12 @@ def inspect PP.pp(subtopic.new, StringIO.new(actual)) assert_equal "inspecting topic\n", actual end + + def test_arel_table_aliases_cache + 10.times do + Fiber.new { Topic.arel_table.alias }.resume + end + Topic.arel_table.alias + assert_equal 1, Topic.arel_table.aliases.size + end end