そういうことだったんですね

いろいろ調べたり学んだりしたことを忘れないように書き連ねています

rails - ActiveRecord Migration のまとめ

基本

  • db/migration 以下に YYYYMMDDhhmmdd_XXX_YYY.rb のファイルを作成する
  • Migrationのファイル名とクラス名は一致していないとダメ
    • ファイル名: YYYYMMDDhhmmdd_create_users.rb
    • クラス名: CreateUsers
  • 自分で設定ファイルを作成可能だが 基本的には rails generate migrationコマンドを使用する。
  • DBに反映するには、rake db:migrate を実行する
    • reversible なコマンド(create_table/add_columnなど)については追加不要
    • カラム名の変更などは手動で定義する必要がある

CreateXXX - テーブルを作成する

$ rails generate migration CreateUsers

自動的に create_table が追加される。
テーブル名は複数形になる。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
    end
  end
end

同時にカラムの定義も可能。
引数に カラム名:型[:オプション(省略可)] (複数可) を指定する。
型省略時は string になる。

$ rails generate migration CreateUsers name:string email:string
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :email
    end
  end
end

AddYYYToXXX - カラムの追加する

カラムの追加。To以下にテーブル名を指定する。

$ rails generate migration AddNameAndEmailToUsers name:string email:string

db/migrate/20140218112618_add_name_and_email_to_users.rb

class AddNameAndEmailToUsers < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    add_column :users, :email, :string
  end
end

RemoveYYYToXXX - カラムを削除する

カラムの削除。追加時と同じく To以下にテーブル名を指定する。

$ rails generate migration RemoveEmailToUsers email:string

db/migrate/20140218112720_remove_email_to_users.rb

class RemoveEmailToUsers < ActiveRecord::Migration
  def change
    remove_column :users, :email, :string
  end
end

AddYYYRefToXXX - 外部テーブルへの参照を作成する

名前が user_id のカラムが追加され、インデックスが貼られる。
外部キー制約は設定されない(DBではなくモデル側でチェックを
するポリシーのため)。

$ rails generate migration AddUserRefToBlogs user:references

db/migrate/20140218114718_add_user_ref_to_blogs.rb

class AddUserRefToBlogs < ActiveRecord::Migration
  def change
    add_reference :blogs, :user, index: true
  end
end

migration の状態を調べる

$ rake db:migrate:status
database: /home/babiy/work/testapp/db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20140218082310  Create users
   up     20140218082651  Add name and email to users
||<