Al's blog

Alexis Toulotte

Suite à mon précédent billet concernant la création d’un jeu de données propre à une migration en utilisant les fixtures ainsi qu’aux nouveautés concernant les migrations dans rails 2.1, quelques ajustements ont du être effectués.

Les fichiers de migrations sont désormais préfixées par un timestamp (exemple : db/migrate/20080618211857_create_admin_user.rb) et non plus par un simple identifiant incrémental. Vos fichiers de fixtures doivent désormais être préfixés par ce même timestamp (exemple : db/fixtures/20080618211857_users.yml).

Voici donc le script lib/create_fixtures.rb mis à jour :

module MigrateFixtures
 
  FIXTURES_LOCATION = File.dirname(__FILE__) + '/../db/fixtures'
  MIGRATIONS_LOCATION = File.dirname(__FILE__) + '/../db/migrate'
 
  def self.extended(object)
    class << object
      alias_method :migrate_without_fixtures, :migrate unless method_defined?(:migrate_without_fixtures)
      alias_method :migrate, :migrate_with_fixtures
    end
  end
 
  def migrate_with_fixtures(direction)
    migrate_without_fixtures(direction)
    return if :down == direction
    migration = current_migration
    cnx = ActiveRecord::Base.connection
    files = fixture_files.find_all do |file|
      file =~ /\/#{migration}_/
    end
    files.each do |file|
      table_name = file.gsub(/.*\/\d+_(.*)\.yml/, '\1')
      say_with_time("Adding #{table_name} fixtures") do
        Fixtures.new(cnx, table_name, nil, file.gsub(/(.*)\.yml/, '\1')).insert_fixtures
      end
    end
  end
 
  private
 
    def current_migration
      version = ActiveRecord::Migrator.current_version
      file = migration_files.find do |f|
        version = '%03d' % version if version.to_s.size &lt; 3
        f =~ /\/#{version}_/
      end
      index = migration_files.index file
      file = index ? migration_files[index + 1] : migration_files.first
      file.gsub(/.*\/(\d+)_.*/, '\1')
    end
 
    def fixture_files
      @fixture_files ||= Dir["#{FIXTURES_LOCATION}/[0-9]*_*.yml"].sort
    end
 
    def migration_files
      @migration_files ||= Dir["#{MIGRATIONS_LOCATION}/[0-9]*_*.rb"].sort
    end
 
end
 
ActiveRecord::Migration.extend(MigrateFixtures)

Note : Cette version est compatible avec les anciennes version de rails.

Un commentaire sur « Fixtures on Rails 2.1 »

  1. thierry dit :

    Bonjour, je dépoussière un peu ce post.
    Déjà, merci beaucoup pour cet idée. Je trouve ca génial et très utile.
    Par contre, j’ai essayé de la mettre en place mais en rajoutant le require dans mon fichier config/environment, je ne peux plus lancer le serveur,
    l’erreur étant la suivante:
    C:/IR/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:266:in `load_missing_constant’: uninitialized constant ActiveRecord (NameError)

    Pourtant mes 2 constantes sont bien définies et je n’ai rien vu dans les méthodes qu’il pouvait assimiler a une constante.
    Je sais que ce n’est pas un forum mais si quelqu’un pouvait me dire ce que j’ai manqué, ca serait extra.

    Merci d’avance.

Laisser un commentaire