Railsのモデル周りのマイグレーション

はじめに


Railsでmigrationするときにいつもアレなんだっけなぁとなることが多いので、
備忘録程度にまとめておく

こんなものドキュメント見れば理解できるので、ざっくりレベルのサマリー程度にしておく

基本


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

1
$rails generate migration クラス名

モデル作成

1
$rails generate model モデル名

モデル&テーブル作成


フィールド指定で作成する場合、以下の形で行う
(大体はフィールド指定を行わずに、実行することが多いかも)

1
$rails g model モデル名 フィールド:型

カラムの型指定


細かい調整をしようと思えばできるけど、一旦これだけ覚えておけば良い

Ruby側の型 DB側の型
string 文字列
text 長い文字列
integer 整数
float 浮動小数
decimal 精度の高い小数
datetime 日時
timestamp タイムスタンプ
time 時間
date 日付
binary バイナリデータ
boolean Boolean

(補足)MySQLで使用する場合の文字列型


MySQLで使用できる文字列型は以下が存在している

DB側の型 内容
CHAR 255Bまでの固定長文字列
VARCHAR 64KBまでの可変長文字列
TINYTEXT 255Bまでの可変長文字列
TEXT 64KBまでの可変長文字列
MEDIUMTEXT 約1.6MBまでの可変長文字列
LONGTEXT 約4.3GBまでの可変長文字列

上記をそれぞれmigrationで利用する場合
以下のようにlimitをつけることで、使用する文字列型を変更することができる

1
2
3
4
5
6
7
8
9
class CreateHoges < ActiveRecord::Migration
  def change
    create_table :articles do |t|
      t.text :value, :limit => 4294967295

      t.timestamps null: false
    end
  end
end

実行すると以下のようになる

1
2
3
4
5
6
7
8
9
10
$ rails db
mysql> show columns from hoges;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| value       | longtext     | YES  |     | NULL    |                |
| created_at  | datetime     | NO   |     | NULL    |                |
| updated_at  | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

limitの値は、以下のように対応している

設定値 DB側の型
1 ~ 255 TINYTEXT
256 ~ 65535 TEXT
65536 ~ 16777215 MEDIUMTEXT
16777216 ~ 4294967295 LONGTEXT

マイグレーション実行


DB作成

1
$rake db:create

マイグレーションの実行

1
$rake db:migrate

マイグレーション結果確認

1
$rake db:migrate:status

ロールバック

1
$rake db:rollback

DBの削除

1
$rake db:drop

シードの投入(マスターデータなどシードで投入することが多い)

1
$rake db:seed

既存カラムの変更


カラムを変更したい場合、以下のコマンドでマイグレーションファイルを生成する

1
$rails g migration ChangeColumnTo<モデル名>

変更は以下のような形で行う(upとdownを定義することでrollbackにも対応できる)

1
2
3
4
5
6
7
8
9
10
11
12
class ChangeColumnToYourModel< ActiveRecord::Migration

  # 変更内容
  def up
    change_column :users, :hoge, :string, null: false, default: 0
  end

  # 変更前の状態
  def down
    change_column :users, :hoge, :string, null: true, default: 0
  end
end

気をつけることとして、change_columnは以下のような順で記載すること

1
change_column :<テーブル名>, :<カラム名>, :<型>, <default値やindexといったオプション指定>

カラムの追加/削除


カラムの追加/削除をしたい場合、以下のコマンドでマイグレーションファイルを生成する
追加の場合は、フィールド指定可能

1
$rails g migration AddColumnTo<モデル>

以下のような形で記載する

1
2
3
4
5
6
7
8
9
10
11
12
13
class AddColumnToYourModel < ActiveRecord::Migration
  def change

    # 追加
    add_column :hoges, :hoge, :string

    # 削除
    remove_column :hoges, :fuga, :string

    # 追加する場所を指定する場合
    add_column :hoges, :fugafuga, :string, :after => :hoge
  end
end

インデックスの追加/削除


カラムの追加/削除と基本は変わらない

1
$rails g migration AddIndexTo<モデル>

以下のようにしてindexを設定する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class AddIndexToYourModel < ActiveRecord::Migration
  def change

    # 追加
    add_index :hoges, :hoge

    # 削除
    remove_index :hoges, :fuga

    # 複合インデックスの場合
    add_index :hoges, [:hoge, :fuga]

  end
end

参考


ここに書いてる内容は、Railsドキュメント見れば一発で理解できるけどな