CRUD操作の基礎

Ruby on RailsのCRUD操作の基礎を学びましょう。

CRUDとは?

CRUD(クラッド)とはアプリケーションにおけるデータ操作の基本となる
4つの機能のことです。
CRUDは以下の4つの操作を指します。

操作説明
Create新しいデータを作成する
Read既存のデータを読み取る
Update既存のデータを更新する
Delete既存のデータを削除する

これら4つの操作の単語の頭文字を取ってCRUDと呼びます。

Scaffoldを使ったCRUDの実装

Ruby on Railsでは、scaffoldというコマンドを使って
CRUD操作を簡単に実装することができます。
scaffoldは、モデル、コントローラー、ビューを自動生成して、
CRUD操作を実装するための基本的なコードを生成します。

では、Railsのscaffoldで簡単なタスク管理アプリケーションを作成してみましょう。
今回はタイトル、説明、完了状態を持つタスクを管理するアプリケーションを作成します。

ジェネレータコマンドは rails generate scaffoldを使用します。

書式は次の通りです。

Terminal window
$ rails generate scaffold モデル名 カラム名:型 カラム名:型 ...

今回のタスク管理アプリケーションでは、Taskというモデルを作成し、
title(文字列)、description(テキスト)、completed(真偽値)の3つのカラムを持つ
Taskモデルを作成します。
ターミナルで次のコマンドを実行します。

Terminal window
$ rails generate scaffold Task title:string description:text completed:boolean

これにより、以下のファイルが生成されます。

  • モデル: app/models/task.rb
  • マイグレーション: db/migrate/xxxxxx_create_tasks.rb
    • xxxxxxはタイムスタンプで、実行時に自動的に生成されます。
  • コントローラー: app/controllers/tasks_controller.rb
  • ビュー: app/views/tasks/
  • ルーティング: config/routes.rb

マイグレーションの実行

マイグレーションとは、移行や変更を意味し、データベースのスキーマを変更するための仕組みです。
マイグレーションを実行することで、今回はデータベースにtasksテーブルが作成されます。

ではサーバーを起動して http://localhost:3000 にアクセスしてみましょう。

Terminal window
$ rails server

次のようなエラーが表示されます。

ActiveRecord::PendingMigrationError

Ruby on Railsの開発環境では未実行のマイグレーションファイルがある場合、
ActiveRecord::PendingMigrationErrorというエラーが発生します。
画面上のRun Pending migrationsをクリックすることでもマイグレーションを実行できますが、
これは開発環境向けの方法なので、本番環境でも利用できる方法でマイグレーションを実行してみましょう。

その前に実行されるマイグレーションの内容を確認してみましょう。
マイグレーションファイルはdb/migrate/xxxxxx_create_tasks.rbです。
xxxxxxの部分はタイムスタンプで、migrationファイルを生成した時刻が入ります。

db/migrate/xxxxxx_create_tasks.rb
class CreateTasks < ActiveRecord::Migration[8.0]
def change
create_table :tasks do |t|
t.string :title
t.text :description
t.boolean :completed
t.timestamps
end
end
end

このマイグレーションファイルは、tasksテーブルを作成し、
次のようなカラムを持つことを定義しています。

カラム名
titlestring
descriptiontext
completedboolean

データベースの操作にはSQLという言語が使われますが、
ここではSQLが一切書かれておらず、Rubyのコードのみです。
これはRuby on RailsのActive RecordというORM(Object-Relational Mapping)ライブラリが
RubyのコードをSQLに変換して実行してくれるためです。
このようにRuby on Railsのマイグレーション機能を用いると、データベースのスキーマの変更を
生SQLを書かずにRubyのコードで記述できます。
このように特定のタスク(今回の場合はマイグレーション)に特化した言語をドメイン固有言語(DSL)と呼びます。
Ruby on Railsでは、マイグレーションのDSLを使ってデータベースのスキーマを定義します。

では、マイグレーションを実行してみましょう。
ターミナルで次のコマンドを実行します。

Terminal window
$ rails db:migrate

マイグレーションのDSL

これでtasksテーブルがデータベースに作成されました。

データベースを確認してみる

データベースにtasksテーブルが作成されたことを確認してみましょう。
Railsでは、デフォルトでSQLiteという軽量なデータベースを使用しています。
SQLiteはファイルベースのデータベースで、特別な設定なしに
データベースを作成できます。
SQLiteのデータベースファイルは、db/development.sqlite3にあります。
SQLiteのデータベースを確認するために、SQLiteのコマンドラインツールを使用します。
ターミナルで次のコマンドを実行します。

Terminal window
$ sqlite3 db/development.sqlite3

正常にコマンドラインツールを起動できると、ターミナルのプロンプトがsqlite>に変わります。

次のコマンドでコマンドラインツールを終了します。

.quit

Ruby on Railsでは次のコマンドでもSQLiteのデータベースを確認できます。

Terminal window
$ rails dbconsole

こちらの方法の方が、Railsの環境に合わせたデータベースのコンソールを起動できるので便利です。
SQLite以外のデータベースを使用している場合でも、同様にデータベースのコンソールを起動できます。

では上記のいづれかの方法でデータベースのコンソールを起動して、
次のコマンドを実行してtasksテーブルが存在することを確認してみましょう。

.tables

次のようにtasksテーブルが表示されるはずです。

Terminal window
ar_internal_metadata schema_migrations
tasks

ar_internal_metadataとschema_migrations

ar_internal_metadataschema_migrationsは、Railsが内部で使用するメタデータを格納するためのテーブルです。
これらのテーブルは、Railsのマイグレーションやデータベースの状態を管理するために使用されます。
主に実行済のマイグレーションファイルの情報を保持し、同じマイグレーションを再実行しないようにするために使用されます。
これらのテーブルは、Railsの内部で使用されるため、通常は直接操作する必要はありません。
Railsが内部で使用しているテーブルなので、誤って削除したり変更したりしないように注意しましょう。

db/schema.rbの確認

rails db:migrateを実行すると、db/schema.rbというファイルが自動的に生成、更新されます。
db/schema.rbは、データベースのスキーマをRubyのコードで表現したものです。

db/schema.rb
ActiveRecord::Schema[8.0].define(version: 2025_06_30_011523) do
create_table "tasks", force: :cascade do |t|
t.string "title"
t.text "description"
t.boolean "completed"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end

ファイルの先頭に書いてある通り、
このファイルは自動生成されるため、手動で変更しないようにしましょう。
開発を進めていくと、migrationファイルが増えていきます。
rails db:migrateはマイグレーションファイルをひとつづつ実行していくため、
データベースを初回にセットアップしたい場合は時間がかかってしまいます。
そこで最新のスキーマをdb/schema.rbに書き出しておき、
db/schema.rbをもとにマイグレーションを実行する、
rails db:schema:loadというコマンドが存在します。
rails db:migrateですべてのマイグレーションを最初から実行するより、
高速かつエラーが発生しにくい方法です。

tasksテーブルのカラムを確認する

次に、tasksテーブルのカラムを確認してみましょう。
データベースのコンソールで次のコマンドを実行します。

.schema tasks

次のようにtasksテーブルのカラムが表示されます。

CREATE TABLE IF NOT EXISTS "tasks" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "description" text, "completed" boolean, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);

マイグレーションファイルに定義したとおり、titledescriptioncompletedの3つのカラムが存在します。
また、created_atupdated_atの2つのカラムも自動的に追加されています。
これらのカラムは、レコードの作成日時と更新日時を自動的に管理するためのものです。
Railsでは、これらのカラムを自動的に追加するために、t.timestampsをマイグレーションファイルに記述します。
これにより、レコードの作成日時と更新日時が自動的に管理されます。

CRUD操作を試してみる

データベースにtasksテーブルが作成されたことが確認できたので、次はCRUD操作を試してみましょう。
サーバーを起動して、ブラウザでhttp://localhost:3000/tasksにアクセスします。

New Taskというリンクが表示されているので、クリックして新しいタスクを作成してみましょう。

New Task

クリックすると http://localhost:3000/tasks/new に移動します。
ここでタスクのタイトル、説明、完了状態を入力してCreate Taskボタンをクリックします。

新規作成

タスクが正常に作成されると、次のような画面が表示されます。
URLは http://localhost:3000/tasks/1 となっており、1は作成されたタスクのIDです。

タスク詳細

タスクの詳細画面からは、タスクの情報を確認したり、編集、削除、一覧画面へ戻ることができます。

ではEdit this taskリンクをクリックして、タスクの編集画面に移動してみましょう。
URLは http://localhost:3000/tasks/1/edit となります。
適当にタイトルや説明を変更して、Update Taskボタンをクリックします。

このようにタスクを作成、表示、編集、削除できるのがCRUD操作です。

タイトルと説明を必須にする

タスクの一覧画面 http://localhost:3000/tasks にもどり、
New Taskリンクをクリックして新しいタスクを作成してみましょう。
あえて、何も入力せずにCreate Taskボタンをクリックしてみます。
そうするとタイトルがない、説明もないタスクが作成されてしまいます。
タイトルと説明が存在しないタスクは作成したくないので、
タイトルと説明を必須にするバリデーション(検証)を追加してみましょう。

app/models/task.rbを開いて、次のようにバリデーションを追加します。

app/models/task.rb
class Task < ApplicationRecord
validates :title, presence: true
validates :description, presence: true
end

presence: trueは、指定したカラムが空でないことを検証するバリデーションです。
これにより、タイトルと説明が空の場合はタスクを作成できなくなります。
では、再度タスクを作成してみましょう。
タイトルと説明を空にしてCreate Taskボタンをクリックすると、
次のようなエラーメッセージが表示されます。

エラーメッセージ

これで、タイトルと説明が必須であることが検証され、空の場合はタスクを作成できなくなりました。

CRUD操作の全体像

CRUD操作の全体像を確認してみましょう。

CRUD操作の全体像

各操作がつながっていることがわかります。

今回はscaffoldを使ってCRUD操作を実装しましたが、
次のレクチャーでは、このCRUD操作を一から実装していきます。