Before we moved from our own internally developed PHP framework to using Ruby on Rails, I had written a database migration library that mimics Rail’s with two key differences:
- It allowed for retroactive running of migrations with versions at or below the current database version.
- It allowed a developer to force run a migration, even if that migration had already been run before.
Point one solves the problem where you have multiple developers sharing the same development database and all writing migrations at the same time. For instance, you create a migration 002_blah, but before you run it and check it in, another developer created, ran and checked in migration 002_bleck. By default in Rail’s, your 002_blah migration will never be run because the database is already on version 002. My library instead says “ok, I’m on version 002, but lets see if there any new migrations at or below that version that have not been run yet.”
Point two is dangerous and indeed has lead our database to get all mucked up more than a few times, but hey, it’s a feature no one is forcing you to use. The “force run” feature lets you run a migration (either up or down) even if it has already been run before. This feature is nice for when you realize you made a mistake in an already run migration and instead of making a new migration, you just want to edit and fix the existing one. You “force down” it, edit/fix it, then “force up” it.
I made a plugin for Rails called Retroactive Migrations (r_migrations) that implements this behavior. For installation and documentation, please see my personal blog post about it.
October 22nd, 2007
Author: Christopher Bottaro

FineTooth is proud to announce joining the OpenAjax Alliance. A big thanks goes out to Jon Ferraiolo at IBM for getting us involved as well as attempting to organize what is quickly becoming a fragmenting technology. With so many frameworks, so many libraries, and so many vendors – all with different goals and applications – now seems like a very opportune time to try to develop some standards. Hopefully, this will empower future developers to take advantage of the trials and tribulations when considering which patterns or libraries to use in their projects. At FineTooth, we hope to offer some contributions in the Markup and Interoperability Committees. Most of the major software players seem to be throwing some weight into this endeavor too – something that makes us want to have the voice of some smaller development shops heard as the Alliance moves forward..
June 19th, 2006
Author: Lindsey Simon
FineTooth is a company using text-mining and knowledge extraction software for a web based contract management solution for new and legacy paper contracts. Please see our home page http://www.finetooth.com for a complete description of our offerings.
When developing our products we have found open source projects, development tools, and libraries as well as the Internet community as a whole very valuable. Like most development shops we use the standard set (linux, apache, mysql, postgresql, cvs, perl, python, php) of tools. Lately we have also started to use some of the javascript libraries, scriptaculous (http://script.aculo.us/) and prototype (http://prototype.conio.net/), for example. In working with these various projects we have found it necessary to at times make bug fixes, or tune them to our specific needs. This blog was initially envisioned as a organized place for our team to discuss our changes and host the source for those changes when appropriate.
We have since thought that this blog would be a good way for our whole development team to:
- Release new code back to the community
- Comment on open source projects we are using or investigating
- Comment on future development of our products
- Preview new features and enhancements to our products
I hope you find our future posts and code valuable, interesting, or at least amusing.
Scott Diedrick
Technical Director
FineTooth
January 10th, 2006
Author: ScottD