Rails Ambassador

Railsのマイグレーションまとめ

こちらではマイグレーションファイルでデータベースを操作するヒントをまとめています。ご自分の環境に合わせたテーブル名やカラム名に置き換えてお試しください。また、マイグレーションを実行したら正しくできているかdb/schema.rbファイルやお使いのデータベースで確認するようにしましょう。

Railsアプリでbigint(20) やtinyint(4)を使いたい

bigint(20) の指定

countというカラムをboardsテーブルにbigint型で指定する例です。

テーブル(モデル)作成時
$ rails g model Board count:integer

これだけですとint型になるだけなので作成したマイグレーションファイルを編集します。

class CreateBoards < ActiveRecord::Migration[5.0]
  def change
    create_table :boards do |t|

      # limit: 8を追加
      t.integer :count, limit: 8, null: false, default: 0

      t.timestamps
    end
  end
end
カラム追加時
$ rails g migration AddCountToBoards count:integer
class AddCountToBoards < ActiveRecord::Migration[5.2]
  def change

    # limit: 8を追加
    add_column :boards :count, :integer, limit: 8, null: false, default: 0
  end
end

integer型に「limit: 8」という指定を追加する事でbigint型を使えるようになります。
念のため空を許さず(null: false)、デフォルト値を0(default: 0)にしています。

tinyint(4)の指定

テーブル作成時
class CreateBoards < ActiveRecord::Migration[5.0]
  def change
    create_table :boards do |t|

      # limit: 1を追加 
      t.integer :count, limit: 1, null: false, default: 0

      t.timestamps
    end
  end
end
カラム追加時
class AddCountToBoards < ActiveRecord::Migration[5.2]
  def change

    # limit: 1を追加
    add_column :boards :count, :integer, limit: 1, null: false, default: 0
  end
end

同様に「 limit: 1」指定を行うとtinyintの指定ができます。

インデックスを追加・削除するマイグレーション

インデックスとは検索を早くするために索引を付けることです。
以下はboardsテーブルのcontentカラム、およびnameカラムの例となります。

マイグレーション作成

追加するマイグレーションファイル名は

Addわかりやすい名前Toテーブル名

にすると良いと思います。

 $ rails g migration AddIndexToBoards

作成したマイグレーションファイルには何も指定が記述されていないので以下を参考に、インデックスの指定を追加してください。

class AddIndexToBoards < ActiveRecord::Migration[5.2]
  def change

    # index追加
    add_index :boards, :content

    #index + ユニーク制限追加
    add_index :boards, :content, unique: true

    # index削除
    remove_index :boards, :content

    # 複合インデックス(nameカラムとcontentカラムの組み合わせの検索が早くなる)
    add_index :boards, [:name, :content]

    # 複合index削除
    remove_index :boards, [:name, :content]

    # 複合ユニーク制限> 
    add_index :boards, [:name, :content], :unique => true

  end
end

インデックスの追加をしたらマイグレーションファイルを保存して実行してください。