マイグレーションスクリプトの作成
マイグレーションを使ってテーブルに変更を行う場合、以前のマイグレーションスクリプトを修正するのではなく、変更を加える為の別のマイグレーションスクリプトを作成し実行します。
モデルを作成する時に自動で作成されるものではなく、新しくマイグレーションスクリプトを作成するには次のように実行します。
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_column
とremove_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