Index: activerecord/lib/active_record/fixtures.rb =================================================================== --- activerecord/lib/active_record/fixtures.rb (revision 4017) +++ activerecord/lib/active_record/fixtures.rb (working copy) @@ -248,7 +248,7 @@ ActiveRecord::Base.silence do fixtures_map = {} fixtures = table_names.map do |table_name| - fixtures_map[table_name] = Fixtures.new(connection, File.split(table_name.to_s).last, class_names[table_name.to_sym], File.join(fixtures_directory, table_name.to_s)) + fixtures_map[table_name] = Fixtures.new(connection, table_name, class_names, File.join(fixtures_directory, table_name.to_s)) end all_loaded_fixtures.merge! fixtures_map @@ -269,16 +269,26 @@ end - attr_reader :table_name + attr_reader :table_name, :fixture_name - def initialize(connection, table_name, class_name, fixture_path, file_filter = DEFAULT_FILTER_RE) + def initialize(connection, table_name, class_names, fixture_path, file_filter = DEFAULT_FILTER_RE) @connection, @table_name, @fixture_path, @file_filter = connection, table_name, fixture_path, file_filter - @class_name = class_name || + @class_name = class_names[table_name.to_sym] || (ActiveRecord::Base.pluralize_table_names ? @table_name.singularize.camelize : @table_name.camelize) + @fixture_name = table_name + @table_name = table_name_for(table_name, class_names) @table_name = ActiveRecord::Base.table_name_prefix + @table_name + ActiveRecord::Base.table_name_suffix read_fixture_files end + def table_name_for(table_name, fixture_classes = {}) + if klass = fixture_classes[table_name.to_sym] + klass.table_name + else + File.split(table_name.to_s).last + end + end + def delete_existing_fixtures @connection.delete "DELETE FROM #{@table_name}", 'Fixture Delete' end @@ -452,6 +462,7 @@ table_names = table_names.flatten.map { |n| n.to_s } self.fixture_table_names |= table_names require_fixture_classes(table_names) + determine_fixture_class_names(table_names) setup_fixture_accessors(table_names) end @@ -467,6 +478,16 @@ end end + def self.determine_fixture_class_names(table_names=nil) + (table_names || fixture_table_names).each do |t| + unless self.fixture_class_names[t.to_sym] + options = {} + options[t.to_sym] = t.classify.constantize rescue nil + set_fixture_class(options) + end + end + end + def self.setup_fixture_accessors(table_names=nil) (table_names || fixture_table_names).each do |table_name| table_name = table_name.to_s.tr('.','_') @@ -565,9 +586,9 @@ fixtures = Fixtures.create_fixtures(fixture_path, fixture_table_names, fixture_class_names) unless fixtures.nil? if fixtures.instance_of?(Fixtures) - @loaded_fixtures[fixtures.table_name] = fixtures + @loaded_fixtures[fixtures.fixture_name] = fixtures else - fixtures.each { |f| @loaded_fixtures[f.table_name] = f } + fixtures.each { |f| @loaded_fixtures[f.fixture_name] = f } end end end Index: activerecord/test/fixtures/clients.yml =================================================================== --- activerecord/test/fixtures/clients.yml (revision 0) +++ activerecord/test/fixtures/clients.yml (revision 0) @@ -0,0 +1,23 @@ +first_client: + id: 10 + type: Client + firm_id: 1 + client_of: 2 + name: Summit + ruby_type: Client + +second_client: + id: 11 + type: Client + firm_id: 1 + client_of: 1 + name: Microsoft + ruby_type: Client + +another_client: + id: 12 + type: Client + firm_id: 4 + client_of: 4 + name: Ex Nihilo + ruby_type: Client Index: activerecord/test/fixtures_test.rb =================================================================== --- activerecord/test/fixtures_test.rb (revision 4017) +++ activerecord/test/fixtures_test.rb (working copy) @@ -11,7 +11,7 @@ self.use_instantiated_fixtures = true self.use_transactional_fixtures = false - fixtures :topics, :developers, :accounts, :tasks, :categories, :funny_jokes + fixtures :topics, :developers, :accounts, :tasks, :categories, :funny_jokes, :clients FIXTURES = %w( accounts companies customers developers developers_projects entrants @@ -326,12 +326,17 @@ end class SetTableNameFixturesTest < Test::Unit::TestCase - set_fixture_class :funny_jokes => 'Joke' - fixtures :funny_jokes + set_fixture_class :funny_jokes => Joke + fixtures :funny_jokes, :clients def test_table_method assert_kind_of Joke, funny_jokes(:a_joke) end + + def test_fixture_with_inheritance + assert_kind_of Client, clients(:first_client) + assert_equal('companies', Client.table_name) + end end class InvalidTableNameFixturesTest < Test::Unit::TestCase