5.

Railsモデルの作成|rails g modelとマイグレーション・references

編集
この記事の要点
  • モデル作成は bin/rails generate model モデル名 カラム:型 ...(省略形 rails g model
  • 同時に マイグレーションファイル / モデルクラス / テスト が生成される
  • モデル名は単数形・PascalCaseUser)。テーブル名は複数形・snake_caseusers
  • リレーションは user:references外部キー + インデックス + belongs_to が自動生成
  • やり直しは rails destroy model(DB 反映前)、db:rollback(反映後)

基本: rails g model

Rails で新しいモデル(テーブル)を作るときは generate model ジェネレータを使います。1 コマンドでモデルクラスとマイグレーション、テストファイルがまとめて生成されます。

# User モデル(name 文字列、age 整数)を作成
bin/rails generate model User name:string age:integer

# 省略形
rails g model User name:string age:integer

生成されるファイル例:

ファイル役割
app/models/user.rbモデルクラス(ApplicationRecord 継承)
db/migrate/YYYYMMDDHHMMSS_create_users.rbテーブル作成マイグレーション
test/models/user_test.rbモデル単体テスト
test/fixtures/users.ymlテスト用フィクスチャ

使えるカラム型

用途
string短い文字列(VARCHAR 255)name:string
text長文(TEXT)body:text
integer整数age:integer
bigint大きな整数(ID 系)views:bigint
float / decimal小数 / 厳密小数price:decimal{10,2}
boolean真偽値published:boolean
date / datetime日付 / 日時published_at:datetime
references外部キー(belongs_to も自動付与)user:references
:uniq 修飾UNIQUE インデックス付与email:string:uniq
:index 修飾通常インデックス付与slug:string:index

リレーション付きで作る

references 型を使うと、外部キーカラム / インデックス / belongs_to の宣言までまとめて入ります。

# Post belongs_to User
bin/rails g model Post title:string body:text user:references

# Comment belongs_to Post and User
bin/rails g model Comment body:text post:references user:references
# 生成されたモデル
class Post < ApplicationRecord
  belongs_to :user
end

# 1 対多の反対側は手動で追加する
class User < ApplicationRecord
  has_many :posts, dependent: :destroy
end

生成されたマイグレーション例

class CreateUsers < ActiveRecord::Migration[7.1]
  def change
    create_table :users do |t|
      t.string  :name,  null: false
      t.string  :email, null: false
      t.integer :age

      t.timestamps        # created_at / updated_at
    end
    add_index :users, :email, unique: true
  end
end

DB へ反映する

# マイグレーションを実行(テーブル作成)
bin/rails db:migrate

# 状態確認
bin/rails db:migrate:status

# 1 つ戻す(誤りに気づいたとき)
bin/rails db:rollback

# 巻き戻して再実行
bin/rails db:migrate:redo

バリデーションを足す

DB 制約とは別に、モデル側でアプリ層のバリデーションを書きます。save 失敗時にエラーメッセージを返してくれます。

class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  validates :email, presence: true,
                    uniqueness: { case_sensitive: false },
                    format: { with: URI::MailTo::EMAIL_REGEXP }
  validates :age,   numericality: { only_integer: true,
                                    greater_than_or_equal_to: 0 },
                    allow_nil: true
end

やり直し: 取り消し方

状況手順
まだ db:migrate していないbin/rails destroy model User でファイル削除
すでに反映済みbin/rails db:rollback でテーブル削除 → destroy
カラム追加 / 削除新しいマイグレーションを g migration で作成(過去ファイルは編集しない)

関連

  • Rails — フレームワーク本体
  • サーバーの起動rails s
  • マイグレーション — db:migrate 関連
  • ActiveRecord — モデル層 ORM
  • コマンド一覧 — 親カテゴリ
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 新規プロジェクトの作成
  2. サーバーの起動
  3. マイグレーションファイルの作成
  4. マイグレーションの実行(migrate)
  5. モデルの作成
  6. 全ルートを確認
  7. Laravelのバージョンの確認方法

最近更新/作成されたページ