RailsでProblemクラスをTaskクラスに変えるという感じのリファクタリングをvimでやる時の手順。(なるべく受け入れテストがある状態でやるのがいいと思った。今回は取り敢えずエラーが出ないことを確認するぐらいのテストしか無かったので怖かった・・・。)
% git checkout -b rename_problems_to_tasks
とりあえず怖いので・・・。
% script/generate migration rename_problems_to_tasks
# db/migrate/20100512071617_rename_problems_to_tasks.rb
class RenameProblemsToTasks < ActiveRecord::Migration
def self.up
rename_table :problems, :tasks
rename_column :comments, :problem_id, :task_id
execute "UPDATE taggings SET taggable_type = 'Task' WHERE taggable_type = 'Problem'"
execute "UPDATE votes SET voteable_type = 'Task' WHERE voteable_type = 'Problem'"
end
def self.down
rename_table :tasks, :problems
rename_column :comments, :task_id, :problem_id
execute "UPDATE taggings SET taggable_type = 'Problem' WHERE taggable_type = 'Task'"
execute "UPDATE votes SET voteable_type = 'Problem' WHERE voteable_type = 'Task'"
end
end
MySQLとPostgreSQLには少なくともrename_tableがあるらしい。他は分からないです。belongs_toなテーブルのidも変更が必要。ポリモーフィック関連や単一テーブル継承を使ってる場合はクラス名が値として入ってるのでそれも変更。怖い!
% vim -c "argdo %s/Problem/Task/gce | update" {app,db,test,config}/**/*
こうするとY/Nで確認しながら置換出来る。(ということを生放送で教えてもらいました。あざーす!) vendorが含まれるとうざいので除外。
% vim -c "argdo %s/problem/task/gce | update" {app,db,test,config}/**/*
小文字で置換(こっちのが大体多い)
% find . -name '*problem*'
% git mv app/helpers/{problems,tasks}_helper.rb
ファイル名もチェックして変更。おお怖い怖い・・・。