From 7753c362626156764ae6de3bc463addad7d4a99d Mon Sep 17 00:00:00 2001 From: Shouichi Kamiya Date: Fri, 31 Mar 2023 11:01:50 +0900 Subject: [PATCH] Remove ActiveRecord::FixtureSet::ClassCache Co-authored-by: Seonggi Yang --- activerecord/lib/active_record/fixtures.rb | 42 ++++------------------ activerecord/test/cases/fixtures_test.rb | 10 ++++++ 2 files changed, 17 insertions(+), 35 deletions(-) diff --git a/activerecord/lib/active_record/fixtures.rb b/activerecord/lib/active_record/fixtures.rb index 5a3fc3056d..786706325d 100644 --- a/activerecord/lib/active_record/fixtures.rb +++ b/activerecord/lib/active_record/fixtures.rb @@ -467,39 +467,6 @@ class FixtureSet cattr_accessor :all_loaded_fixtures, default: {} - class ClassCache # :nodoc: - def initialize(class_names, config) - @class_names = class_names.stringify_keys - @config = config - - # Remove string values that aren't constants or subclasses of AR - @class_names.delete_if do |klass_name, klass| - !insert_class(@class_names, klass_name, klass) - end - end - - def [](fs_name) - @class_names.fetch(fs_name) do - klass = default_fixture_model(fs_name, @config).safe_constantize - insert_class(@class_names, fs_name, klass) - end - end - - private - def insert_class(class_names, name, klass) - # We only want to deal with AR objects. - if klass && klass < ActiveRecord::Base - class_names[name] = klass - else - class_names[name] = nil - end - end - - def default_fixture_model(fs_name, config) - ActiveRecord::FixtureSet.default_fixture_model_name(fs_name, config) - end - end - class << self def default_fixture_model_name(fixture_set_name, config = ActiveRecord::Base) # :nodoc: config.pluralize_table_names ? @@ -554,7 +521,7 @@ def instantiate_all_loaded_fixtures(object, load_instances = true) def create_fixtures(fixtures_directories, fixture_set_names, class_names = {}, config = ActiveRecord::Base, &block) fixture_set_names = Array(fixture_set_names).map(&:to_s) - class_names = ClassCache.new class_names, config + class_names.stringify_keys! # FIXME: Apparently JK uses this. connection = block_given? ? block : lambda { ActiveRecord::Base.connection } @@ -654,7 +621,6 @@ def initialize(_, name, class_name, path, config = ActiveRecord::Base) @config = config self.model_class = class_name - @fixtures = read_fixture_files(path) @table_name = model_class&.table_name || self.class.default_fixture_table_name(name, config) @@ -727,6 +693,7 @@ def read_fixture_files(path) yaml_files.each_with_object({}) do |file, fixtures| FixtureSet::File.open(file) do |fh| self.model_class ||= fh.model_class if fh.model_class + self.model_class ||= default_fixture_model_class self.ignored_fixtures ||= fh.ignored_fixtures fh.each do |fixture_name, row| fixtures[fixture_name] = ActiveRecord::Fixture.new(row, model_class) @@ -734,6 +701,11 @@ def read_fixture_files(path) end end end + + def default_fixture_model_class + klass = ActiveRecord::FixtureSet.default_fixture_model_name(@name, @config).safe_constantize + klass if klass && klass < ActiveRecord::Base + end end class Fixture # :nodoc: diff --git a/activerecord/test/cases/fixtures_test.rb b/activerecord/test/cases/fixtures_test.rb index c5ef08ac30..b947625f19 100644 --- a/activerecord/test/cases/fixtures_test.rb +++ b/activerecord/test/cases/fixtures_test.rb @@ -915,6 +915,16 @@ def test_uses_set_fixture_class end end +class FixtureWithSetModelClassPrevailsOverNamingConventionTest < ActiveRecord::TestCase + def test_model_class_in_fixture_file_is_respected + Object.const_set(:OtherPost, Class.new(ActiveRecord::Base)) + other_posts = create_fixtures("other_posts").first + assert_kind_of Post, other_posts["second_welcome"].find + ensure + Object.send(:remove_const, :OtherPost) + end +end + class CheckSetTableNameFixturesTest < ActiveRecord::TestCase set_fixture_class funny_jokes: Joke fixtures :funny_jokes