blog.name.nil? - blog

db/seeds.rb

← Billet précédent

Initialiser une application avec des données nécessaires à son bon fonctionnement n'était pas vraiment aidée par rails et ses normes : faut il créer un script distinct ? utiliser un jeu de fixtures ? un controlleur de configuration de l'application ? une migration ?

Depuis l'arrivée des 'seed data', nous avons une méthode normalisée rails pour effecter cette tâche : le fichier db/seeds.rb peut être éxécutée via la task rake db:seed. En l'instance, il s'agit d'un simple script ruby exécuté par la rake task. Mais on peut tout de même en tirer beaucoup, notemment pour gérer cela en production.

City.create :name => "Paris"
City.create :name => "New-York"

Après avoir joué quelque peu avec cette commande, on constate qu'elle souffre d'un grand défaut : étant un script ruby, des exécutions multiples risquent de créer les données de base à chaque exécution. Il est toujours plus agréable et moins risqué de ne pas avoir à réfléchir à l'état ou le contenu de sa base de données avant d'exécuter une tache. L'idée ici est de remplacer les create par des find_or_create évitant de doubler les données.

%w{Paris New-York}.each {|city_name| City.find_or_create_by_name city_name}

On peut aussi perfectionner la chose en autorisant la mise à jour de ces données primaires avec le script de seeds :

cities = {
  "Paris" => {
    :country => "France",
    :zipcode => "75000"
  },
  "New-York" => {
    :country => "USA",
    :zipcode => "10001"
  }  
}

cities.each do |city_name, city_infos|
  city = City.find_or_initialize_by_name city_name
  city.update_attributes city_infos
end

Ainsi, à chaque appel de la rake task, les données seront soit crées si non présentes soit mises à jour, sans avoir à se préocuper de l'état de la base.

Toujours dans l'idée de simplifier les choses et minimiser les interventions humaines (et les erreurs potentielles), on peut lancer cette rake task à chaque déploiement en production : un simple ajout dans le script de déploiement capistrano fait l'affaire.

namespace :deploy do
  namespace :database do
    desc "Load seed data"
    task :seed, :roles => :db, :only => { :primary => true } do
      run "cd #{current_path} && rake db:seed"
    end
  end
end

after "deploy", "deploy:database:seed"

On transforme donc le simple script d'initialisation d'application en outil léger de maintenance de données systèmes, simplifiant le déploiement et le développement quotidien.

# · Aucun commentaire

Ajouter un commentaire

Pseudo :
Commentaire :


Antispam: 9 + 1 ?
Créez-vous un compte pour en être débarrassé !
URL :
Email :
Gravatars activés.
Se souvenir de moi