Ruby
Rails
migration
RubyOnRails

RailsのMigrationコマンドを自分用にまとめました。

モデル作成

$ rails generate model <モデル名単数形>
  • example
$ rails generate model ship

モデル修正

$ rails g migration Add<列名>To<モデル名> <列名>:<型>
$ rails db:migrate

列を追加したい例

  • User テーブルに locale 列を追加したい例
$ rails g migration AddLocaleToUser locale:string
$ rails db:migrate

参照関係を追加したい例

  • IssueComment テーブルにRoleモデルの参照関係(role列)を追加したい例
$ rails g migration AddRoleToIssueComment role:references
$ rails db:migrate

参照関係を追加したい例(外部キー制約を付けない場合)

def change
  add_reference :issue_comments, :role, foreign_key: false
end

列を削除したい例

  • User テーブルの列 locale を 削除したい例
$ rails g migration RemoveLocaleToUser locale
$ rails db:migrate

参照関係を削除したい例

  • IssueComment テーブルに role 列を削除したい例
def change
  remove_reference :issue_comments, :role, index: true, foreign_key: true
end

テーブル名を変更したい例

  • User テーブルの名前 users を hoge_users に変更したい例
def change
  rename_table :users, :hoge_users
end

列名を変更したい例

  • User テーブルの列 local の列名を locale に変更したい例
def change
  rename_column :users, :local, :locale # 列名をlocaleに変更
end

列の型を変更したい例

  • User テーブルの列 locale を text型 → string型 に変更したい例
def change
  change_column :users, :locale, :string
end

indexを追加したい例

  • Ship テーブルの列 ship_code にindex(Unique制約有)を付けたい場合
def change
  add_index :ships, :ship_code, :unique => true
end

indexを追加したい例(複数列)

  • ShipEquipment テーブルの列 ship_id,sfi,equipment_model_id にindex(Unique制約有)を付けたい場合
def change
  add_index :ship_equipments, [:ship_id, :sfi, :equipment_model_id], :unique => true
end

既にindexが存在するテーブルにUnique制約を付けたい例

def change
  remove_index :ship_equipments, [:ship_id, :sfi, :equipment_model_id]
  add_index :ship_equipments, [:ship_id, :sfi, :equipment_model_id], :unique => true
end

indexが長すぎるため、index名を付けたい例

def change
  add_index :satellite_speed_logs, [:ship_equipment_id, :measurement_date], name: :index_satellite_speed_logs_ship_equipment_measurement_date
end

モデル削除

def change
  drop_table :users
end

rollback

$ rails db:version # 現在のバージョンの確認
Current version: 20180816060332
$ rails db:rollback # 1つ前に戻す
$ rails db:rollback STEP=2 # 2つ前に戻す

DBの再構築

$ rails db:reset
# すべてのテーブルをdrop
# "db/schema.rb" を元にテーブルを再作成