require 'migrate' class AddEndTimeToChangesets < ActiveRecord::Migration def self.up # swap the boolean closed-or-not for a time when the changeset will # close or has closed. add_column(:changesets, :closed_at, :datetime, :null => false) # it appears that execute will only accept string arguments, so # this is an ugly, ugly hack to get some sort of mysql/postgres # independence. now i have to go wash my brain with bleach. execute("update changesets set closed_at=(now()-#{interval_constant('1 hour')}) where open=(1=0)") execute("update changesets set closed_at=(now()+#{interval_constant('1 hour')}) where open=(1=1)") # remove the open column as it is unnecessary now and denormalises # the table. remove_column :changesets, :open # add a column to keep track of the number of changes in a changeset. # could probably work out how many changes there are here, but i'm not # sure its actually important. add_column(:changesets, :num_changes, :integer, :null => false, :default => 0) end def self.down # in the reverse direction, we can look at the closed_at to figure out # if changesets are closed or not. add_column(:changesets, :open, :boolean, :null => false, :default => true) execute("update changesets set open=(closed_at > now())") remove_column :changesets, :closed_at # remove the column for tracking number of changes remove_column :changesets, :num_changes end end