Document Your Models the Easy Way
I suspect this is because they relate to the dreaded “d” word: documentation. This is a shame, because these two tools make basic documentation a cinch.
One of the best things about the popular Ruby ORM libraries like ActiveRecord and DataMapper is that you don’t need to spell out the attributes of your models; they are inferred from the database.
Sometimes, though, it is useful to have this information at hand, instead of firing up script/console or your database to answer a simple question like: “Did he call it User.first, User.firstname or User.first_name?”
The annotate_models gem, originally written by Dave Thomas creates a nice comment block at the top of each model, displaying information about the underlying columns/attributes:
# == Schema Information # Schema version: 20090311145521 # # Table name: groups # # id :integer(4) not null, primary key # name :string(255) # description :text # created_at :datetime # updated_at :datetime # status :integer(4) default(1) #
Producing this documentation is as simple as running
annotate in your Rails application’s root directory.
Another nice aspect of annotate_models: it will only modify the headers of models that have changed since the last time it was run.
Another useful view of a Rails application, especially a legacy one, is the big picture: i.e., how do all the models (and controllers) fit together? This can be especially daunting when you are following the trail of
:has_and_belongs_to from one file to another.
A free tool, Javier Smaldone’s RailRoad, can tell you all that information at once, by generating a diagram of the models and key information about them, like names, attributes, associations and inheritance relationships.
A minor inconvenience is that the project’s models are outputted in
.dot format. This is easily converted into
.png if, like me, you prefer those formats.
Because I do this often, I have added the following alias to my
~/.bashrc and just run
rr as needed.
alias rr='railroad -M | dot -Tsvg > doc/models.svg; railroad -M | neato -Tpng > doc/models.png'
If you are happy with
.dot files (e.g. you are a GraphViz user), it’s as simple as running
Another cool feature: you can use RailRoad to document your controllers too; just pass it the
-C flag instead of
Now, I know this hardly suffices as thorough documentation. However, I also know that I’ve been in web development for a decade and most projects I’ve seen have no documentation at all.
Complete documentation would be great, but it is time-consuming and requires good written communication skills — a tall order for your typical software engineer. Keeping that documentation up-to-date with rapidly-evolving software is even more challenging.
These two tools provide great “bang for the buck”. Check out the repository and run these two commands, and suddenly a legacy Rails application is far less opaque.
I run the commands manually, but you may also consider automating it as part of your build process, or even as a post-hook for
Either way, you can trust me on this: if you spend fifteen minutes installing these gems, a few seconds running
rr, you will save hours over the course of your projects.