Ruby
RubyOnRails

Ruby on Rails カラムの追加と削除

More than 1 year has passed since last update.


マイグレーションスクリプトの作成

マイグレーションを使ってテーブルに変更を行う場合、以前のマイグレーションスクリプトを修正するのではなく、変更を加える為の別のマイグレーションスクリプトを作成し実行します。

モデルを作成する時に自動で作成されるものではなく、新しくマイグレーションスクリプトを作成するには次のように実行します。

rails generate migration クラス名

クラス名は任意ですが、通常は「行なう処理+テーブル名」のようになります。

例えばAddColumnTitlesです。

rails generate migration AddColumnTitles

マイグレーションスクリプトファイルがdb/migrate/20120416054354_add_column_titles.rbに作成されており中身は次のようになっています。

class AddColumnTitles < ActiveRecord::Migration

def up
end

def down
end
end

中身が空のupメソッドとdownメソッドが定義されてクラスが記述されています。クラス名は先程実行する時に指定したクラス名となっています。

あとは実行した処理をupメソッドの中に記述し、変更を元に戻すための処理をdownメソッドの中に記述します。

class AddColumnTitles < ActiveRecord::Migration

def up
add_column :titles, :place, :string
end

def down
remove_column :titles, :place, :string
end
end

これでテーブルに変更を加えるためのマイグレーションスクリプトが完成しました。


カラムの追加と削除

カラムの追加、またはカラムの削除を行いたい場合、rails generate migrationを実行する時に特別な規則に従った名前を指定し、引数に追加又は削除するカラム名とデータ型の組み合わせを指定することで、自動的にadd_column又はremove_columnメソッドを呼び出す文がスクリプトファイル内に記載されます。

書式は次のとおりです。

rails generate migration クラス名 カラム名:データ型( カラム名:データ型)

クラス名はAddXXXToYYYまたはRemoveXXXFromYYYとします。

YYYにはテーブル名を指定します。

XXXには追加又は削除するカラム名を指定するのですが違う文字列でも構いません

(複数のカラムを同時に追加する場合などは指定できないので)。


カラム追加

では実際に実行してみます。まずはinteger型のpriceカラムとstring型のauthorカラムを追加してみます。

rails generate migration AddDetailsToTitles price:integer author:string

マイグレーションスクリプトファイルがdb/migrate/20120416072618_add_details_to_titles.rbに作成されており中身は次のようになっています。

class AddDetailsToTitles < ActiveRecord::Migration

def change
add_column :titles, :price, :integer

add_column :titles, :author, :string

end
end

クラス名で指定したテーブルに対して指定した2つのカラムを追加するための文が記述されています。(add_columnremove_columnの呼び出したがそれぞれ使われるため、upメソッドとdownメソッドではなくchangeメソッドが使われています。


カラム削除

次に先程追加したstring型のauthorカラムを削除してみます。

rails generate migration RemoveAuthorFromTitles author:string

マイグレーションスクリプトファイルがdb/migrate/20120416074444_remove_author_from_titles.rbに作成されており中身は次のようになっています。

class RemoveAuthorFromTitles < ActiveRecord::Migration

def up
remove_column :titles, :author
end

def down
add_column :titles, :author, :string
end
end

クラス名で指定したテーブルに対してカラムを削除するための文が記述されています。(この場合はchangeメソッドではなくupメソッドとdownメソッドを分けて記述する必要があります)。

このように比較的使われるとカラムの追加と削除についてはここでご紹介した方法を使うと少し簡単にマイグレーションスクリプトを作成できます。


マイグレーションスクリプトの削除

rails destroy migration クラス名

の書式で、削除できます。

rails destroy migration AddColumnTitles