Rails : chargement des données initiales dans la base de données

Il est fréquent que les applications aient besoin, pour fonctionner, de données initiales dans la base de données. Il y a plusieurs avis dans la communauté sur le moyen de charger ces données.

Aucune méthode préférentielle ne se dégage. En particulier, les méthodes proposant de créer les données de test avec le code de l’application sont inapplicables pour une importation sérieuse, tant par leur lourdeur que par la difficulté de maintenir les données de test au fur de l’évolution du code. J’ai choisi trois articles qui couvrent bien le sujet.

Luke Francl a écrit un article qui balaye les diverses possibilités Loading seed data.

Michael Bleigh propose, dans son article Seed Fu: Simple Seed Data for Rails, de créer les données grâce à des scripts Ruby placés dans le répertoire db/fixtures.

Enfin, Jeffrey Allan Hardy décrit dans Seed Data in Rails la méthode simple et aisée à mettre en œuvre que j’ai retenue. Il s’agit d’utiliser le puissant mécanisme des fixtures dans une tâche rake.

Les données sont saisies dans des fichiers YAML placés dans le nouveau répertoire db/fixtures. Une tâche rake est ajouté en créant le fichier db_seed.rake dans le répertoire lib/tasks.

namespace :db do
  desc "Load seed fixtures (from db/fixtures) into the current environment's database." 
  task :seed => :environment do
    require 'active_record/fixtures'
    Dir.glob(RAILS_ROOT + '/db/fixtures/*.yml').each do |file|
      Fixtures.create_fixtures('db/fixtures', File.basename(file, '.*'))
    end
  end
end

Et voilà ! Les données sont chargées avec la commande rake db:seed.