Use the progressbar gem for long running data migrations
And one other thing that is not included with rails that you should probably be using anyway: the progressbar gem. If you any long running data migrations, this is a must. And just because it isn’t long running for you with your developer DB doesn’t mean it won’t be long running during deployment to production. It’s trivially easy to use, and your deployer’s won’t be stuck wondering if their connection has been dropped or the migration has locked up. And the ETA will let them know if they have time to get a cup of coffee. The other developers and deployers will thank you.
Simple Example
(albeit, also a poorly contrived example)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 require 'progressbar' class CreateWidgetAuxiliaryFrobs < ActiveRecord::Migration def self.up create_table :widget_auxiliary_frobs do |t| t.integer "widget_id" t.string "frob_type" t.integer "frobitude" # etc... end say_with_time("migrating froms from widgets") do widgets = Widget.find(:all) pbar = ProgressBar.new("Generating Widget Frobs", widgets.size) widgets.each do |w| # this code changes the data irreversibly # this code can't be (easily) rewritten with a SQL UPDATE or INSERT # etc etc etc pbar.inc end pbar.finish end say_with_time("delete obsolete widget/wadgit data") do Wadget.delete_all("value = 'kerfluffle'") remove_column :widget, :foo remove_column :widget, :bar_id # etc... end end def self.down raise ActiveRecord::IrreversibleMigration end end
I love rails. Every so often you see a blog post about some little bit of code that makes you go -- cool, I always wanted that.