Railsのデータベースにカラムを追加・削除したい!
Railsアプリを作っていると
既存のデータベースにカラムを追加・削除したい時ありますよね。
例えば、usersテーブルに
- name
- nickname
というカラムがあったけど、
「画像のカラム(image)も作ってみたいなー」
とか
「ニックネームのカラム(nickname)いらねーなー」
というシチュエーションですね。
そんな時に備えてマスターしておきたいのが、
Railsでテーブルのカラムを追加・削除する方法
です。
今日はこちらの方法を紹介しますよ。
※ 利用環境は以下の通りです。
Rails バージョン | 2.5.0 |
---|---|
Ruby バージョン | 5.2.4.1 |
Railsでカラムを追加する方法
まずカラム追加する方法から。
Step1. マイグレーションファイルを作成
データベースをいじる前に、マイグレーションファイルを生成しましょう。
マイグレーションファイルとは、データベースの作成・変更に必要なファイルです。
データベースの設計図、下書きと例えられることが多いです。
Railsではいきなりデータベースの中身を編集しません。
マイグレーションファイルを作り、変更の要件を書き込み、実行してデータベースの中身を書き換えます。
そのマイグレーションファイルを作るコマンドはズバリ、
$ rails g migration 任意のファイル名
です。
例えば、
$ rails g migration add_image_to_users
とすれば add_image_to_users というマイグレーションファイルが誕生するのです。
マイグレーションファイルの名前はぶっちゃけなんでもいいんですが、名前に
- テーブル名
- カラム名
を含ませると、なおよし。
マイグレーションファイルを見返した時、「生誕の理由」を察しやすいでしょう。
ただ、ネーミングは自由で規則はありません。
Step2. マイグレーションファイルを編集する
マイグレーションファイルを編集します。
マイグレーションファイルの場所は、Railsアプリの階層でいうと
db > migrate
に入っていますね。
さきほど誕生したマイグレーションファイルは、肝心の部分は白紙。
つまり、自分で変更内容を書かなければなりません。
具体的にいうと、
def change end
というchangeメソッドの中身を書いていきます。
カラムを追加したい時は、changeメソッドに、
add_column :テーブル名, :カラム名, :データ型
を記載しましょう。
例えば、usersテーブルにimageカラム(string型)を追加したいときは、こんな感じですね。
def change add_column :users, :image, :string end
Step3. マイグレーションファイルを実行
さて、あとはマイグレーションファイルを実行するだけ。
実行のコマンドは、
rails db:migrate
ですよ。
コマンドラインで発動しちゃってください。
カラムを削除したい時はどうする??
以上、Railsのデータベースにカラムを追加する方法でした。
それでは、カラムを削除する方法はどうなんでしょうかね。
じつは、削除方法も簡単。
さっきのStep 2で「メソッド名を変えるだけ」です。
お察しの通り、add_columnではなくremove_columnにすればいいのです。
だから、先ほどの例で出したchangeメソッドはこうなります。
def change remove_column :users, :image, :string end
これでマイグレーションファイルを同じように
$ rails rails db:migrate
を実行すると、指定カラムを削除できますね。
複数のカラムを同時に追加・削除したい時はどうする??
が、しかし時には、
1つのマイグレーションファイルで「複数のカラム」を追加・削除したい時がありますよね。
1カラムごとに1マイグレーションファイルを作っていたら日が暮れちゃいますからね。
そんな時は、シンプルに、
changeメソッド内に複数の命令文を書けばOK。
例えば、
def change add_column :users, :image, :string add_column :users, :birthday, :integer end
としてやると、imageカラムだけなく、birthdayカラムまでusersテーブルに追加できちゃうわけです。
この方法は何もadd_columnだけでなく、remove_columnを混ぜても構いません。
カラムの追加・削除はRailsアプリで必要になる技なので、マスターしておきましょう。
それでは!
Lin
【参考記事】

おそらく、ブロガー。
今年でフリーランス 6年目。