目次へ

1. マイグレーション(2)

2012/09/24 シナジーマーケティング(株) 鈴木 圭

1.4. データ型

Ruby on Rails(正確には ActiveRecord)では以下のデータ型をサポートしています。

型名 説明
binary バイナリ
boolean 真偽値
date 日付
datetime 日時
decimal 固定長整数
float 浮動小数点数
integer 整数
primary_key 主キー
string 文字列
text テキスト
time 時間
timestamp タイムスタンプ

「サポートしている」とは、カラムのデータ型に指定すると使用しているデータベースの適切な型にマッピングされるということです。
例えばデータベースに PostgreSQL を使用しているとすると、string は VARCHAR(255)、integer は INTEGER にマッピングされます。
先ほどの users テーブルを作成するマイグレーションをもう一度取り上げます。

    class CreateUsers < ActiveRecord::Migration

      def up
        # ユーザ情報を保持する users テーブルを作成する.
        create_table :users do |table|
          # 名前.
          table.string :name, :null => false

          # メールアドレス.
          table.string :email, :null => false

          # 年齢.
          table.integer :age, :null => false

          # 登録日時, 更新日時.
          table.timestamps
        end
      end

      def down
        # users テーブルを削除する.
        drop_table :users
      end

    end

このマイグレーションを実行すると、以下の SQL が PostgreSQL に対して実行されます。

    -- ユーザ情報を保持する users テーブルを作成する.
    CREATE TABLE users (
      -- 主キー.
      id SERIAL PRYMARY KEY,

      -- 名前.
      name VARCHAR(255) NOT NULL,

      -- メールアドレス.
      email VARCHAR(255) NOT NULL,

      -- 年齢.
      age INTEGER NOT NULL,

      -- 登録日時.
      created_at TIMESTAMP,

      -- 更新日時.
      updated_at TIMESTAMP
    );

Ruby on Rails でサポートされているデータ型を使用することで、
実際に使用するデータベースに依存しない形でマイグレーションを記述することができます。

データベース固有のデータ型を指定したい場合は、以下のように文字列でデータ型を指定することもできます。

    create_table(:users) do |table|
      table.column 'VARCHAR(255)', :name
    end

1.5. マイグレーション API

Ruby on Rails が提供するマイグレーション API について解説します。
ここでは全てのオプションについては解説しませんので、適宜 API リファレンスをご参照ください。

create_table(table_name, options={})

table_name に指定した名前のテーブルを作成します。 create_table はブロックを引数として受け取り、カラム定義はブロックの中で行います。
    create_table(:users) do |table|
      table.string :name, :null => false
    end

change_table(table_name, options={})

table_name に指定したテーブルの定義を変更します。 create_table と同じ書式で、既存のテーブル定義をまとめて変更します。
    change_table(:users) do |table|
      table.string :email, :null => false
    end

drop_table(table_name, options={})

table_name に指定したテーブルを削除します。
    drop_table(:users)

add_column(table_name, column_name, type, options={})

table_name に指定したテーブルにカラムを追加します。 カラム名は column_name、データ型は type で指定します。 options で指定可能なオプションは多くありますので、ここでは一般的なものを説明します。
    # :null オプションで NOT NULL 制約の有無を指定する (デフォルトは true)
    add_column(:users, :status, :integer, :null => false)

    # :default オプションでデフォルト値を指定する
    add_column(:users, :status, :integer, :default => 0)

    # :limit オプションで最大長を指定する (文字列型の場合は文字数, バイナリや整数型の場合はバイト数)
    add_column(:users, :email, :string, :limit => 1024)

    # 固定長整数の精度を :precision, 小数点以下の桁数を :scale オプションで指定する
    add_column(:users, :score, :decimal, :precision => 10, :scale => 4)

change_column(table_name, column_name, type, options={})

table_name に指定したテーブルのカラムを変更します。 カラム名は column_name、データ型は type、その他のオプションは options に指定します。
    change_column(:users, :email, :string, :limit => 500)

rename_column(table_name, column_name, new_column_name)

table_name に指定したテーブルのカラム名を変更します。 変更前のカラム名を column_name、新しいカラム名を new_column_name に指定します。 データ型や制約などを変更したい場合は change_column を使用します。
    rename_column(:users, :name, :name_kanji)

add_index(table_name, column_name, options={})

table_name に指定したテーブルのカラムにインデックスを作成します。 column_name にカラム名、もしくはカラム名の配列を指定します。
    # インデックスを作成する
    add_index(:users, :email)

    # インデックス名を指定する
    add_index(:users, :email, :name => 'users_email_index')

    # :unique オプションでユニークインデックスを作成する
    add_index(:users, :email, :unique => true)

    # 複合インデックスを作成する場合はカラム名の配列を指定する
    add_index(:users, [:email, :status])

remove_index(table_name, options={})

table_name に指定したテーブルのカラムに作成されたインデックスを削除します。
    # カラムを指定して削除する
    remove_index(:users, :name)

    # 複合インデックスを削除する
    remove_index(:users, [:name, :status])

    # インデックス名を指定して削除する
    remove_index(:users, :name => 'users_email_index')

execute(sql, name=nil)

sql に指定された SQL を実行します。
    execute('ALTER TABLE users ADD CONSTRAINT fk_group_id FOREIGN KEY (group_id) REFERENCES groups(id)')

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp