593
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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

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

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

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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
593
Help us understand the problem. What are the problem?