Cet article est publié sous licence CC BY-NC-SA
Nous sommes parfois amenés à devoir comprendre rapidement un projet rails en cours de développement. Les raisons peuvent être multiples:
Selon l’avancée du projet et selon votre expérience, il peut être difficile de comprendre les tenants et aboutissants de l’application rapidement. Cette étape est pourtant primordiale car elle vous fera gagner beaucoup de temps (ou en tout cas vous évitera d’en perdre).
Dans cet article, nous utiliserons la gem ‘rails-erd’ qui nous permettra en moins de 5 minutes d’avoir une représentation visuelle de notre schéma de base de données (tables, champs et relations) ainsi que des diagrammes visuels de nos modèles et contrôleurs.
Dans la majorité des cas, notre premier réflexe est de faire tourner l’application. Hors cela n’est pas indispensable, voir nécessaire à la compréhension de notre application.
Nous allons prendre pour notre exemple un projet rails open-source: sample_app_rails_4. Vous pouvez bien évidemment prendre le projet qui vous plaît.
Nous devons rapidement comprendre le projet afin de commencer à développer. Premièrement nous allons récupérer la source du projet depuis Github.
git clone https://github.com/openbookie/sportbook.git
Rails-erd a été conçu pour Rails 3 mais s’adapte bien à Rails 4. Il requiert cependant l’installation de la bibliothèque Graphviz (v2.26+ conseillée) afin de générer les fichiers PDF. Installons donc cette bibliothèque :
Mac OS X avec homebrew :
brew install graphviz
Mac OS X avec Macport :
sudo port install graphviz
Debian ou Ubuntu :
sudo aptitude install graphviz
Afin de pouvoir utiliser la gem dans votre application Rails, il est nécessaire de l’ajouter au Gemfile :
group :development do
gem 'rails-erd'
end
Puis nous demandons à bundler de nous l’installer :
bundle install
Vous avez maintenant tout ce qu’il faut pour générer votre diagramme.
ATTENTION: Si vous êtes sur MAC OS X avec Mavericks, vous devez modifiez la police utilisée par la gem. Pour ce faire vous devez modifier les fichiers suivants :
“my_app/vendor/gems/rails-erd-1.1.0/lib/rails_erd/diagram/graphviz.rb”
Lignes: 60, 67, 74 changez la police Arial-Bold en Arial-BoldMT et Arial en ArialMT
“my_app/vendor/gems/rails-erd-1.1.0/lib/rails_erd/diagram/templates/node.html.erb”
Lignes: 3,9 changez la police Arial-Bold en Arial-BoldMT et Arial-Italic en Arial-ItalicMT
L’installation de la gem a ajouté une nouvelle tâche rake “rake erd”, nous pouvons le vérifier en tapant “rake -T” dans notre terminal.
Il est temps de générer notre diagramme, pour cela, je lance ma tâche rake associée :
rake erd
Cette commande va générer un fichier ERD.pdf à la racine de notre application, ouvrons le !
Nous voilà face au diagramme que nous attendions. Grâce à celui-ci, nous allons pouvoir identifier tous les modèles de l’application, leurs relations mais également leurs attributs et types associés.
Dans le cas de notre exemple, nous pouvons rapidement savoir que :
Il y a deux choses importantes à comprendre pour faciliter la lecture :
Voici la représentation graphique de notre table nommée “User”. Nous apercevons ses attributs, leurs types ainsi que les attributs obligatoires (matérialisés par une étoile).
Notre exemple ne nous permet pas de voir toutes les relations, les images utilisées ci-dessous ne correspondent donc pas (source).
Voici comment sont illustrés les relations entre modèles :
class Country < ActiveRecord::Base
# A country may or may not have a head of state.
has_one :head_of_state
end
class HeadOfState < ActiveRecord::Base
belongs_to :country
# A head of state always belongs to a country.
validates_presence_of :country
end
class Galleon < ActiveRecord::Base
# Galleons have up to 36 cannons.
has_many :cannons
validates_length_of :cannons, :maximum => 36
end
class Cannon < ActiveRecord::Base
# A cannon belongs to a galleon.
belongs_to :galleon
end
class Film < ActiveRecord::Base
# A film belongs to one or more genres.
has_and_belongs_to_many :genres
end
class Genre < ActiveRecord::Base
# Each genre may be applicable for one or more films.
has_and_belongs_to_many :films
end
class Wizard < ActiveRecord::Base
has_many :spells, :through => :spell_masteries
has_many :spell_masteries
end
class Spell < ActiveRecord::Base
has_many :spell_masteries
end
class SpellMastery < ActiveRecord::Base
belongs_to :wizard
belongs_to :spell
end
Inheritance est désactivé par défaut, il faut donc le spécifier rake erd inheritance=true
class Beverage < ActiveRecord::Base
end
class Beer < Beverage
end
class Whisky < Beverage
end
Le polymorphisme est désactivé par défaut, il faut le spécifier également rake erd polymorphism=true
class Barricade < ActiveRecord::Base
# Defensible structures have many soldiers.
has_many :soldiers, :as => :defensible
end
class Stronghold < ActiveRecord::Base
# Defensible structures have many soldiers.
has_many :soldiers, :as => :defensible
end
class Soldier < ActiveRecord::Base
# Soldiers belong to a defensible structure.
belongs_to :defensible, :polymorphic => true
end
Afin de se rendre compte de la rapidité de compréhension d’une application grâce à cette gem, nous allons prendre l’exemple d’un projet open source avancé.
Gemcutter est une application qui gère toutes les gems disponibles pour ruby (RubyGems).
Voici son diagramme :
Sans parcourir les fichiers de l’application nous pouvons déjà savoir pour le modèle User par exemple :
La lecture du fichier se fait assez facilement et donne une bonne vision globale de l’application. Vous pouvez, à partir de ce diagramme, déduire les relations pour les autres modèles.
La gem “rails-erd” nous permet de spécifier des options pour notre tâche rake, afin de personnaliser le diagramme que nous voulons générer. Vous pouvez retrouver la totalité des options ici.
Voici quelques exemples de personnalisation:
Ce diagramme ne comporte aucunes relations obligatoires (aucun cercle plein à l’extrémité des relations).
A titre d’exemple, voici un diagramme où :
Rails ERD permet donc, lorsqu’on doit rapidement s’approprier un projet rails en cours de développement, de pouvoir avoir une vision globale de l’application en un minimum de temps. Les options fournies par la gem nous permettent vraiment de pouvoir exporter à un diagramme selon nos besoins. Cela peut être utile dés que l’on a besoin de présenter le projet à un interlocuteur technique (client ou collaborateur).
Peut-être une gem en plus à votre trousse de travail pour un gain de productivité et support de travail.
L’équipe Synbioz.
Libres d’être ensemble.
Nos conseils et ressources pour vos développements produit.