Railsでテーブルを作成する機会があったので、自分でやったやり方をまとめる。
①コマンドを実行
$ rails g model Test(任意のモデル名)
※g
はgenerateの略。
間違えた場合は
rails d model user(任意のモデル名)
で削除できる。
コマンドを実行すると、以下ファイルが自動で作られる。
①モデルのクラスファイル(app/models配下に作られる)
②マイグレーションファイル(db/migrate配下に作られる)
③テスト系のファイル(この辺は導入しているテストツールで異なる?)
②マイグレーションファイルを編集
生成されたマイグレーションファイルを修正し、テーブルの中身のカラムを作成するため設定をしていきます。
マイグレーションのファイル名は、生成日時が自動でつき、コマンドで実行したモデル名の複数形で名前がつきます。
例:20220711090757_create_tests.rb
class CreateTests < ActiveRecord::Migration[6.1]
def change
create_table :tests do |t|
# ここから下に設定したい内容を記載していく
t.string :name, null: false
t.integer :status, null: false
end
end
end
カラムには、id、created_at(作成日時)、update_at(更新日時)は自動で設定されるため
改めてここで設定する必要はない。
基本的にはこの後マイグレーションを実行して、この内容でマイグレーションされるので
その後にカラムを追加したい場合などは、下記コマンドを実行することになる。
$ rails g migration AddImageToTests name:string
Add Image
で追加したいカラム名、ToTests
でカラムを追加したいテーブル名を指定します。
※テーブル名の指定は複数形で。
削除したい場合はAddをRemoveに変える。
$ rails g migration RemoveImageToTests name:string
③モデルファイルを編集
生成されたモデルファイルを編集して制約などを設定します。
class Test < ApplicationRecord
# ここから下に設定したい内容を記載していく
has_one :profile
has_many :tweets
belongs_to :user
with_options presence: true do
validates :name
validates :status
end
end
has_one
などの設定は、作成したテーブルを他テーブルと関連付けたい時に設定する。
has_one
・・・他テーブルとの関連の対象が1つ(単数形で記述)
has_many
・・・他テーブルとの関連の対象が複数(複数形で記述)
belongs_to
・・・このテーブルが他テーブルに所属している(単数形で記述)
あとはvalidateなどの設定があれば記述する。
④マイグレーションを実行
$ rails db:migrate
マイグレーションを実行するコマンドを入力。
これでマイグレーションファイルに設定した内容で、テーブルとそれに付随するカラムが作成された。
補足
マイグレーション実行後にカラムなどの内容を変更したい場合。
(※マイグレーションファイルの削除は絶対にやってはいけない!)
$ rails db:migrate:status
コレで現状のマイグレーションの状況が確認できるので、バージョンを確認する。
$ rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20220711042708 Create users
up 20220711051028 Add email to users
up 20220711055028 Create tweets
up 20220711090757 Create tests
下記のコマンドを実行すると、データベースの状態が最新のmigrationファイルを実行する前に戻る。
STEP=1
は、1つ前のバージョンに戻す。もしくは戻したいバージョンのMigration IDを指定する。
$ rails db:rollback STEP=1
もしくは
$ rails db:migrate VERSION=20220711055028
== 20220711090757 CreateTests: reverting ==============================
-- drop_table(:tests)
-> 0.0160s
== 20220711090757 CreateTests: reverted (0.0288s) =====================
これで再度rails db:migrate:status
すると、マイグレーションしたファイルがdownになっていることがわかる。
$ db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20220711042708 Create users
up 20220711051028 Add email to users
up 20220711055028 Create tweets
down 20220711090757 Create tests
この状態でマイグレーションファイルを編集し、再度rails db:migrate
すれば、
変更した内容でマイグレーションが実行される。
基本的にこの方法はデータベースに反映済みの場合はやってはいけない。