💿

Railsで新しくテーブルを作成するときの基本的な流れ

2021/03/30に公開

Railsで新しくモデルを作成するときの備忘メモ

マイグレーションファイルを作成

$ rails g model Test

マイグレーションファイルの編集

マイグレーションファイルを「rails g model Test」で作成すると、次のようなファイルが作成される。

class CreateQuestions < ActiveRecord::Migration[5.2]
  def change
    create_table :tests do |t|

      t.timestamps
    end
  end
end

基本としては、create_table :tests do |t| から end の間に追加したいカラムの情報をつけていく。

ここでは、string型のtitleカラムと、inter型の No というカラムを追加させる。
なお、255文字以下の文字列ならば string 型、それ以上であれば text 型を使います。

class CreateQuestions < ActiveRecord::Migration[5.2]
  def change
    create_table :tests do |t|
      t.string :title
      t.integer :No
      t.timestamps
    end
  end
end

これであとは「rails db:migrate」:を実行すれば、titleカラムとNoカラムとtimestampsカラムを持つ「Test」というテーブル(表のようなもの)が作成される。

マイグレーションファイルをデータベースに反映

$ rails db:migrate

モデルに制約をつけていく

通常、作成したモデルに入れる情報(ここではテーブルに入るデータのようなイメージ)には、好き勝手な情報を入れられないように**制約(validates)**をつけてあげます。
ちなみにモデルファイルを編集したあとは、特にコマンドを実行する必要はありません。

次の例は、空のタイトルが入力されないように Test モデルに制約(バリデーションといいます)をつける例です。

class Question < ApplicationRecord
  validates :title, presence: true
end

なお、複数のバリデーションをもたせることもできます。
例えばタイトルの長さを100文字以下にしてほしい場合は次のように記述します。

class Question < ApplicationRecord
  validates :title,
    presence: true,
    length: { maximum: 100 }
end

以下ではよく使うバリデーションを整理

空の値ではないこと

validates :title, presence: true

一意性(かぶらないようにしたいとき)

validates :title, uniqueness: true

長さ

validates :title,    length: { minimum: 10 }       # 「10文字以上」
validates :title,    length: { maximum: 100 }      # 「100文字以下」
validates :title,    length: { in: 10..100 }        # 「10文字以上100文字以下」
validates :title, length: { is: 8 }            # 「8文字のみ」

数値であること

例えばinteger型で書いてほしいとき

validates :No, numericality: true

メールアドレス形式

正規表現を駆使していて少し難しいと思うので、コピペが楽

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX }

これで「@が入っているか」「一意性があるか」「空ではないか」といった、メールアドレスのデータとして必要な要件を包含できているので便利です。

Discussion