LoginSignup
0
1

More than 1 year has passed since last update.

【Rails】テーブルの作成手順

Posted at

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すれば、
変更した内容でマイグレーションが実行される。
基本的にこの方法はデータベースに反映済みの場合はやってはいけない。

0
1
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
0
1