LoginSignup
10
3

More than 3 years have passed since last update.

マイグレーションファイルの命名について

Last updated at Posted at 2019-04-01

前提

ここではキャメルケースで命名するが、スネークケースでも良い。
blogsテーブルに対して変更を加えると仮定し、まとめて見た。

blogsテーブルを作成

rails g migration CreateBlogs

※通常は、Model生成時、一緒にテーブルを作成することがほとんどだから、よっぽどのことがない限り使わない。

マイグレーションファイルの例
def change
  create_table :blogs do |t|
    t.string :name
    t.string :email

    t.timestamps
  end
  #add_indexすると、user_idに関連付けられたすべてのマイクロポストを作成時刻の逆順で取り出しやすくなる。
  add_index :microposts, [:user_id, :created_at]
end

blogsテーブルを削除

rails g migration DropBlogs
def change
  drop_table :users
end

blogテーブルにカラムを追加

rails g migration AddTitleToBlogs
複数のカラムを追加する場合
rails g migration AddColumnsToBlogs
def change
  add_column :blogs, :image, :text

  # カラムを追加する場所を、:afterで指定
  add_column :users, :status, :string, :after => :email
end

blogテーブルからカラムを削除

rails g migration RemoveTitleFromBlogs
複数のカラムを削除する場合
rails g migration RemoveColumnsFromBlogs
def change
  remove_column :blogs, :image, :text
end

blogsテーブルのtitleカラムの名前をcontentに変更

rails g migration RenameFromTitleToContentOnBlogs
def change
  rename_column :blogs, :title, :content
end

blogsテーブルにカラムのindexを追加・削除

rails g migration AddIndexTitleToBlogs
    # 追加
    add_index :blogs, :title

    # ユニーク追加
    add_index :blogs, :title, unique: true

    # 削除
    remove_index :blogs, :title

    # 複合インデックスの場合
    add_index :blogs, [:name, :name2]
他のユニーク制約の付与の仕方
 def change
    create_table :users do |t|
      t.string :name, null: false
      t.string :email, null: false
      t.string :password_digest, null: false

      t.timestamps
      t.index :email, unique: true

blogsテーブルに外部キー(user_id)を設定

rails g migration AddUserRefToBlog user:references
#user:referencesをつけて、一気にmigarateまで持って行くのもあり。
def change
  add_reference :blogs, :user, foreign_key: true

  # 外部キーの削除
  remove_foreign_key :blogs, column: :user_id

  # カラムも一緒に削除
  remove_reference :blogs, :user, foreign_key: true
end

blogsテーブルにNOT NULL制約を設定

# 既存のテーブルの既存のカラムをNOT NULL制約する時。
def change
  change_column_null :blogs, :name, false
end

# limit30の制約をつける場合
def change
  change_column :tasks, :name, :string, limit: 30
end

# 新しくテーブルを追加する時。(limit制約を含めて)
def change
  create_table :blogs do |t|
   t.string :name, limit: 50, null: false
  end
end

up/downの例


# downの処理(バージョンを下げる)後、upする(バージョンを上げる)
def up
  change_column_null :blogs, :name, :string, limit: 30
end

def down
  change_column_null :blogs, :name, :string
end

ユニークの付与

def change
  create_table :blogs do |t|
   t.string :name, limit: 50, unique: true
  end
end

その他


def change
    create_table :messages do |t|
      t.text :body
      t.references :conversation, index: true, foreign_key: true
      t.references :user, foreign_key: true, null: false
      t.boolean :read, null: false, default: false

      t.timestamps null: false
    end
  end

boolean型は通常「値がないならnil」とする実装は少ないため、、カラムを作成する際はnull: false, default: falseなどのオプションであらかじめ制御をするのが一般的。
※null: falseを追加設定するケースも想定する必要あり。


def change
    create_table :conversations do |t|
      t.integer :sender_id
      t.integer :recipient_id

      t.timestamps
    end
    add_index :conversations, :sender_id
    add_index :conversations, :recipient_id
    add_index :conversations, [:sender_id, :recipient_id], unique: true
  end

[:sender_id, :recipient_id]が同じ組み合わせで保存されないようにする。


NOT NULL制約を追加カラムに付与する場合の例

def change
    add_column :tasks, :deadline, :datetime, :null => false, default: -> { 'CURRENT_TIMESTAMP' }
end

既存の他のカラムに対してのエラーを出さないように、defaut値を設定する必要がある。

adminカラムの追加

class AddAdminToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :admin, :boolean, default: false, null: false
  end
end

複合indexとunique trueを設定

class CreateAddIndexAndPairUniqueMark < ActiveRecord::Migration[5.2]
  def change
    add_index :job_roles, [:groupable_id, :groupable_type :employee_id], unique: true, name: "change name"
  end
end

ポリモーフィックの場合のindexの貼り方

  def change
    create_table :pictures do |t|
      t.string  :name
      t.integer :groupable_id
      t.string  :groupable_type
      t.timestamps
    end

    add_index :pictures, [:groupable_type, :groupable_id]
  end
end

not nullを追加で実装する場合
https://ver-1-0.net/2018/03/01/rails-migration-not-null

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3