Back to Blog

Get in Touch

Document Your Models the Easy Way

By Joe Grossberg March 16, 2009 in rails, ruby, documentation

Missing

At a recent DCRUG meeting, I was surprised by how many Rubyists, novice and experienced, were unfamiliar with two great documentation tools: annotate_models and RailRoad.

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.

annotate_models

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.

RailRoad

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 :belongs_to and :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.

model diagram for depot application

A minor inconvenience is that the project’s models are outputted in .dot format. This is easily converted into .svg and .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 railroad -M.

Another cool feature: you can use RailRoad to document your controllers too; just pass it the -C flag instead of -M.

Conclusion

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 rake db:migrate.

Either way, you can trust me on this: if you spend fifteen minutes installing these gems, a few seconds running annotate and rr, you will save hours over the course of your projects.

Medium

Joe Grossberg

Joe brings over a decade of professional front- and back-end web development experience to the table, with expertise in Ruby on Rails and JavaScript. He also organizes monthly meetings for the DC Ruby Users Group. Prior to working at Intridea, Joe was a software engineer at Revolution Health, where he developed enterprise-level B2B and D2C applications.

More posts by Joe Grossberg

Joe Grossberg

Finding it hard to get a local group started, or to keep one going? DCRUG has...

Joe Grossberg

Think RSpec is only for testing ruby? Think again! It is simple and quick to ...

Joe Grossberg