Module: ActiveRecord::TestFixtures::ClassMethods

Defined in:
activerecord/lib/active_record/fixtures.rb

Instance Method Summary collapse

Instance Method Details

#fixtures(*fixture_names) ⇒ Object


753
754
755
756
757
758
759
760
761
762
763
764
# File 'activerecord/lib/active_record/fixtures.rb', line 753

def fixtures(*fixture_names)
  if fixture_names.first == :all
    fixture_names = Dir["#{fixture_path}/**/*.{yml}"]
    fixture_names.map! { |f| f[(fixture_path.size + 1)..-5] }
  else
    fixture_names = fixture_names.flatten.map { |n| n.to_s }
  end

  self.fixture_table_names |= fixture_names
  require_fixture_classes(fixture_names)
  setup_fixture_accessors(fixture_names)
end

#require_fixture_classes(fixture_names = nil) ⇒ Object


778
779
780
781
782
783
784
# File 'activerecord/lib/active_record/fixtures.rb', line 778

def require_fixture_classes(fixture_names = nil)
  (fixture_names || fixture_table_names).each do |fixture_name|
    file_name = fixture_name.to_s
    file_name = file_name.singularize if ActiveRecord::Base.pluralize_table_names
    try_to_load_dependency(file_name)
  end
end

#set_fixture_class(class_names = {}) ⇒ Object


749
750
751
# File 'activerecord/lib/active_record/fixtures.rb', line 749

def set_fixture_class(class_names = {})
  self.fixture_class_names = self.fixture_class_names.merge(class_names)
end

#setup_fixture_accessors(fixture_names = nil) ⇒ Object


786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
# File 'activerecord/lib/active_record/fixtures.rb', line 786

def setup_fixture_accessors(fixture_names = nil)
  fixture_names = Array.wrap(fixture_names || fixture_table_names)
  methods = Module.new do
    fixture_names.each do |fixture_name|
      fixture_name = fixture_name.to_s.tr('./', '_')

      define_method(fixture_name) do |*fixtures|
        force_reload = fixtures.pop if fixtures.last == true || fixtures.last == :reload

        @fixture_cache[fixture_name] ||= {}

        instances = fixtures.map do |fixture|
          @fixture_cache[fixture_name].delete(fixture) if force_reload

          if @loaded_fixtures[fixture_name][fixture.to_s]
            ActiveRecord::IdentityMap.without do
              @fixture_cache[fixture_name][fixture] ||= @loaded_fixtures[fixture_name][fixture.to_s].find
            end
          else
            raise StandardError, "No fixture with name '#{fixture}' found for table '#{fixture_name}'"
          end
        end

        instances.size == 1 ? instances.first : instances
      end
      private fixture_name
    end
  end
  include methods
end

#try_to_load_dependency(file_name) ⇒ Object


766
767
768
769
770
771
772
773
774
775
776
# File 'activerecord/lib/active_record/fixtures.rb', line 766

def try_to_load_dependency(file_name)
  require_dependency file_name
rescue LoadError => e
  # Let's hope the developer has included it himself

  # Let's warn in case this is a subdependency, otherwise
  # subdependency error messages are totally cryptic
  if ActiveRecord::Base.logger
    ActiveRecord::Base.logger.warn("Unable to load #{file_name}, underlying cause #{e.message} \n\n #{e.backtrace.join("\n")}")
  end
end

#uses_transaction(*methods) ⇒ Object


817
818
819
820
# File 'activerecord/lib/active_record/fixtures.rb', line 817

def uses_transaction(*methods)
  @uses_transaction = [] unless defined?(@uses_transaction)
  @uses_transaction.concat methods.map { |m| m.to_s }
end

#uses_transaction?(method) ⇒ Boolean

Returns:

  • (Boolean)

822
823
824
825
# File 'activerecord/lib/active_record/fixtures.rb', line 822

def uses_transaction?(method)
  @uses_transaction = [] unless defined?(@uses_transaction)
  @uses_transaction.include?(method.to_s)
end