【Rails】カラムを追加・削除する方法!

rails

こんにちは、tekute-kuです。

今回はすでにあるテーブルに新しくカラムを追加する方法を紹介したいと思います。

記事を書いた目的

アプリケーションを作っていると、すでにあるテーブルに新しいカラムを追加しなければならなくなることがあります。その作業をやらなければならなくなる度に毎回忘れてしまっているので、知識の定着のためアウトプットします。

またこの記事が私と同じような状況の方の役に立てれば幸いです。

マイグレーションスクリプトの作成!、、の前にまずは用語の確認

まずはマイグレーションスクリプトの作成をします!

、、、とはいったもののマイグレーションについて、今まではなんとなくで使っていただけなのでここでなんなのかをはっきりさせておきましょう。

マイグレーションとは

マイグレーション(Migration)は英語で移行、移動、乗換えなどの意味があります。

IT用語では既存システムやソフトウェア、データなどを別の環境に移転したり、新しい環境に移行することを意味します。ではRailsでどのように使われているのでしょうか。

通常、データベースのテーブルを新たに作成する際やカラムを新たに追加する際にはSQL文を直接実行して、作成します。

それに対してマイグレーションを使えば、マイグレーションスクリプトと呼ばれるスクリプトファイルを作成し実行すれば、簡単に変更や追加ができます。さらにSQL文を使わずにRailsで決められた文法で記述すれば良いのでとても簡単です。

Railsにおけるマイグレーションの特徴

  • データベースの種類によらず同じRailsで決められた文法で記述すれば良い(SQLiteやMy SQLでも)
  • スクリプトファイルは記述された順に残るので、最初に記述されたものから順に実行することで簡単に同じテーブルを作成できる
  • スクリプトファイルは実行する処理と逆の処理を行なうスクリプトを合わせて記述しておくことになっているので実行した後に同じスクリプトで元に戻すことができる

 

なるほど、これまで何気なく使っていたマイグレーションファイルのことがなんとなく分かりました。こういった理由でマイグレーションスクリプトを作成しないといけないのですね!

 

カラムを追加する方法

それでは本題に戻ってカラムを追加する手順を確認していきます。

先ほども出てきましたマイグレーションスクリプトであるマイグレーションファイルを作成します。

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

モデルを作成した時に自動生成されたものを使用するのではなく、新しくマイグレーションファイルを作成します。

今回はCustomerテーブルにTermカラムを追加したいです。

テーブルにカラムを追加したい場合のマイグレーションファイルを作成する基本のコマンドは以下のとおり。

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

クラス名は任意ですがクラス名は「行う処理+カラム名+to+テーブル名」とすることをオススメします。なぜかというとto+テーブル名としておくとRailsが自動的にカラムを作成したいテーブルにカラムを追加するマイグレーションを作成してくれるからです。

今回は”Customersターブル”に”termカラム”を追加したいのでクラス名のところに「add_term_to_customers」を入れます。

データ型には真偽型の”boolean”を指定したいので、カラム名:データ型には「customers:boolean」を入れます。

これらを入れ込んだコマンドがこちらになります。

rails generate migration add_term_to_customers term:boolean

これで実行すると、、、

rails generate migration add_term_to_customers term:boolean
Running via Spring preloader in process 51595
      invoke  active_record
      create    db/migrate/[timestamp]_add_term_to_customers.rb

これで

db/migrate/[timestamp]_add_term_to_customers.rb

が作成されました。

マイグレーションファイルの記述

作成されたマイグレーションファイルを見てみましょう。

db/migrate/[timestamp]_add_term_to_customers.rb

class AddTermToCustomers < ActiveRecord::Migration[5.2]
 def change
  add_column :customers, :term, :boolean
 end
end

add_columnメソッドでcustomersテーブルにtermカラムを追加しています。

これはRailsが先ほどのコマンドから判断して、自動的にマイグレーションを作ってくれたおかげです。

rails db:migrate

これを適用させるためには以下のコマンドを実行します。

rails db:migrate

これでcustomersテーブルにtermカラム(データ型:boolean)を追加できました。

カラムを削除する方法

次にすでにあるカラムを削除したい場合の方法をご紹介します。

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

カラムを追加した時と同様に、削除する場合もマイグレーションファイルを新たに作成します。

この場合も先ほども出てきた以下のコマンドで大丈夫です。

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

今回は削除ですのでクラス名の記述方法が少し変わります。

先ほど追加したcustomersテーブルのtermカラムを削除したいので

クラス名はremove_term_from_customersになります。そうすると以下のようなコマンドを実行します。

rails generate migration remove_term_from_customers term:boolean

実行結果

rails generate migration remove_term_from_customers term:boolean
Running via Spring preloader in process 79857
      invoke  active_record
      create    db/migrate/[timestamp]_remove_term_from_customers.rb

これでマイグレーションファイルが作成されました。

rails db:migrate

そして同じみのコマンドを実行すればカラムを削除できます。

rails db:migrate

これでカラムの削除が完了しました。

まとめ

  • Railsではマイグレーションスクリプトであるマイグレーションファイルを作成してカラムの追加や削除ができる
  • マイグレーションファイルの作成の際のコマンドを決まった書き方で実行すれば、Railsが自動で処理する記述を書いてくれる
  • 最後にrails db:migrateを実行しなければ、処理されない
  • カラムの追加も削除も基本的な流れは同じ

いかがだったでしょうか。間違ってカラムを作ってしまったり、後からカラムを追加しなければならなくなった場合などはよくあることだと思いますので、しっかり押さえておきたいやり方ですね。

 

参考:

コメント