プログラミング

【Rails】基本的なマイグレーションファイルの書き方

マイグレーションファイルの書き方
ユウマ
こんにちは、ユウマ(@yuuuma_11)です。

Railsでマイグレーションファイルを扱う時に忘れがちなコマンドや、書き方について必要最低限な分だけ簡単にまとめてみました。

マイグレーションファイルの生成

マイグレーションファイルを生成するコマンドは2つあります。

1つ目がモデルとマイグレーションファイルを同時に作成するコマンドです。

テーブルを新たに作成する時は、このコマンドを使用してモデルとマイグレーションファイルを同時に作成してしまうことが多いです。

rails g model "モデル名"

2つ目はマイグレーションファイルのみを生成する方法です。

こちらは主に、既に存在しているテーブルの情報を変更する時に使用します。

rails g migration "クラス名"

マイグレーションファイルの書き方

今回はproducts(商品)テーブルを作成し、テーブルの中に「name(商品名)」「description(商品の説明)」 「price(商品の価格)」の3つのカラムを作ることを想定して解説します。

新たにテーブルを作成する時

まずは新しくテーブルを作成する際の書き方です。

制約の設定を特に行わない場合

新たにテーブルを作成する際、制約の設定を特に行わない場合以下の書き方になります。


class CreateProducts < ActiveRecord::Migration[5.2]
 
  def change
    create_table :Products do |t|
     #t.型の名前 :カラムの名前
      t.string  :name
      t.text    :description
      t.integer :price
      t.timestamps
    end
  end
 
end

制約の設定を行う場合

制約の設定を行う場合(以下はカラムが空で保存されるのを防ぐ設定)は、以下の書き方になります。


class CreateProducts < ActiveRecord::Migration[5.2]
 
  def change
    create_table :Products do |t|
     #t.型の名前 :カラムの名前, 制約: 許可、非許可
      t.string  :name, null: false
      t.text    :description, null: false
      t.integer :price, null: false
      t.timestamps
    end
  end
 
end

外部キー制約をつける場合

productsテーブルの他に、商品の画像を保存する「imagesテーブル」があることを想定して説明します。

外部キー制約をつける場合は、以下の書き方で設定することが可能です。


class CreateProducts < ActiveRecord::Migration[5.2]
 
  def change
    create_table :Products do |t|
      t.string  :name
      t.text    :description
      t.integer :price

     #t.reference型 :紐付けたいテーブル名, 外部キー制約の設定
      t.references :image, foreign_key: true
      t.timestamps
    end
  end
 
end

上記のように書くことで、「image_id」カラムが作成されimagesテーブルと紐付けることが可能になります。

ちなみに、reference型を使用しないと「foreign_key: true」を付け足しても外部キー制約にはなりません。

既に存在するテーブルに変更を加える時

次は、既に存在するテーブルにカラムを追加したり、既に存在するカラムを変更する場合の書き方をまとめていきます。

カラムを追加する

まずは既に存在するテーブルに新しいカラムを追加する書き方です。

以下の例は、productsテーブルにsize(商品の大きさ)カラムを追加する書き方です。


class AddColumnProducts < ActiveRecord::Migration[5.2]

  def change
  #add_column :カラムを追加するテーブル名, :新しく追加するカラム名, :型
    add_column :products, :size, :string
  end

end

カラムを削除する

カラムを削除する場合は「remove_column」を使います。


class RemoveDescriptionFromProducts < ActiveRecord::Migration[5.2]
 
  def change
  #remove_column :テーブル名, :削除するカラム名, :型
    remove_column :products, :description, :text
  end
 
end

ポイント

ここで注意しないといけないのが、カラムを削除する際、型を指定してあげないとロールバック時に「型が無い」というエラーが出てしまいます。

カラム名を変更する

次に、作成済のカラムの名前を変更する書き方です。

以下の例では、間違えて作成した「prise」カラムを「price」に変更しています。


class RenamePriseColumnToProducts < ActiveRecord::Migration[5.2]
  def change
  #rename_column :テーブル名, :変更前のカラム名, :変更後のカラム名
    rename_column :products, :prise, :price
  end
end

 カラムのデータ型を変更する

カラムのデータ型を変更する場合は、changeメソッドではなく、up/downメソッドを使用します。

以下の例では、priceカラムのデータ型を「string」から「integer」に変更しています。


class ChangeDataPriceToProducts < ActiveRecord::Migration[5.2]

  def up
   #change_column :テーブル名, :型を変更したいカラム名, :変更後のデータ型
    change_column :products, :price, :integer
  end

  def down
   #change_column :テーブル名, :型を戻すカラム名, :変更前のデータ型
    change_column :products, :price, :string
  end

end

ポイント

「change_column」を使う時、changeメソッドを使用してもマイグレーション自体はできるのですが、ロールバック時にエラーが出てしまいます。

そのためup/downメソッドを使って、バージョンを上げるときの処理とバージョンを下げるときの処理を書いておくことで、エラーを回避することができます。

カラムにNOT NULL制約を設定する

最後に、既に存在しているカラムにNOT NULL制約を設定する方法です。

「change_column_null」を使用します。


class ChangeNameToProducts < ActiveRecord::Migration[5.2]
  def change
  #change_column_null :テーブル名, :制約を設定するカラム名, :null許可、非許可
    change_column_null :posts, :name, false
  end
end

最後に

マイグレーションファイルの書き方は、慣れていないと忘れやすいと思います。

頻繁に使用する基本的な部分はなるべく覚えて、検索する手間を省いていけるようにした方がいいですね。

-プログラミング

Copyright© ユウマのブログ , 2020 All Rights Reserved.