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