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

ファイル名もチェックして変更。おお怖い怖い・・・。

Comments


Option