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を使用します。
書式は次の通りです。
$ rails generate scaffold モデル名 カラム名:型 カラム名:型 ...今回のタスク管理アプリケーションでは、Taskというモデルを作成し、
title(文字列)、description(テキスト)、completed(真偽値)の3つのカラムを持つ
Taskモデルを作成します。
ターミナルで次のコマンドを実行します。
$ rails generate scaffold Task title:string description:text completed:booleanこれにより、以下のファイルが生成されます。
- モデル:
app/models/task.rb - マイグレーション:
db/migrate/xxxxxx_create_tasks.rbxxxxxxはタイムスタンプで、実行時に自動的に生成されます。
- コントローラー:
app/controllers/tasks_controller.rb - ビュー:
app/views/tasks/ - ルーティング:
config/routes.rb
マイグレーションの実行
マイグレーションとは、移行や変更を意味し、データベースのスキーマを変更するための仕組みです。
マイグレーションを実行することで、今回はデータベースにtasksテーブルが作成されます。
ではサーバーを起動して http://localhost:3000 にアクセスしてみましょう。
$ rails server次のようなエラーが表示されます。

Ruby on Railsの開発環境では未実行のマイグレーションファイルがある場合、
ActiveRecord::PendingMigrationErrorというエラーが発生します。
画面上のRun Pending migrationsをクリックすることでもマイグレーションを実行できますが、
これは開発環境向けの方法なので、本番環境でも利用できる方法でマイグレーションを実行してみましょう。
その前に実行されるマイグレーションの内容を確認してみましょう。
マイグレーションファイルはdb/migrate/xxxxxx_create_tasks.rbです。
xxxxxxの部分はタイムスタンプで、migrationファイルを生成した時刻が入ります。
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 endendこのマイグレーションファイルは、tasksテーブルを作成し、
次のようなカラムを持つことを定義しています。
| カラム名 | 型 |
|---|---|
| title | string |
| description | text |
| completed | boolean |
データベースの操作にはSQLという言語が使われますが、
ここではSQLが一切書かれておらず、Rubyのコードのみです。
これはRuby on RailsのActive RecordというORM(Object-Relational Mapping)ライブラリが
RubyのコードをSQLに変換して実行してくれるためです。
このようにRuby on Railsのマイグレーション機能を用いると、データベースのスキーマの変更を
生SQLを書かずにRubyのコードで記述できます。
このように特定のタスク(今回の場合はマイグレーション)に特化した言語をドメイン固有言語(DSL)と呼びます。
Ruby on Railsでは、マイグレーションのDSLを使ってデータベースのスキーマを定義します。
では、マイグレーションを実行してみましょう。
ターミナルで次のコマンドを実行します。
$ rails db:migrate
これでtasksテーブルがデータベースに作成されました。
データベースを確認してみる
データベースにtasksテーブルが作成されたことを確認してみましょう。
Railsでは、デフォルトでSQLiteという軽量なデータベースを使用しています。
SQLiteはファイルベースのデータベースで、特別な設定なしに
データベースを作成できます。
SQLiteのデータベースファイルは、db/development.sqlite3にあります。
SQLiteのデータベースを確認するために、SQLiteのコマンドラインツールを使用します。
ターミナルで次のコマンドを実行します。
$ sqlite3 db/development.sqlite3正常にコマンドラインツールを起動できると、ターミナルのプロンプトがsqlite>に変わります。
次のコマンドでコマンドラインツールを終了します。
.quitRuby on Railsでは次のコマンドでもSQLiteのデータベースを確認できます。
$ rails dbconsoleこちらの方法の方が、Railsの環境に合わせたデータベースのコンソールを起動できるので便利です。
SQLite以外のデータベースを使用している場合でも、同様にデータベースのコンソールを起動できます。
では上記のいづれかの方法でデータベースのコンソールを起動して、
次のコマンドを実行してtasksテーブルが存在することを確認してみましょう。
.tables次のようにtasksテーブルが表示されるはずです。
ar_internal_metadata schema_migrationstasksar_internal_metadataとschema_migrations
ar_internal_metadataとschema_migrationsは、Railsが内部で使用するメタデータを格納するためのテーブルです。
これらのテーブルは、Railsのマイグレーションやデータベースの状態を管理するために使用されます。
主に実行済のマイグレーションファイルの情報を保持し、同じマイグレーションを再実行しないようにするために使用されます。
これらのテーブルは、Railsの内部で使用されるため、通常は直接操作する必要はありません。
Railsが内部で使用しているテーブルなので、誤って削除したり変更したりしないように注意しましょう。
db/schema.rbの確認
rails db:migrateを実行すると、db/schema.rbというファイルが自動的に生成、更新されます。
db/schema.rbは、データベースのスキーマをRubyのコードで表現したものです。
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 endendファイルの先頭に書いてある通り、
このファイルは自動生成されるため、手動で変更しないようにしましょう。
開発を進めていくと、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);マイグレーションファイルに定義したとおり、title、description、completedの3つのカラムが存在します。
また、created_atとupdated_atの2つのカラムも自動的に追加されています。
これらのカラムは、レコードの作成日時と更新日時を自動的に管理するためのものです。
Railsでは、これらのカラムを自動的に追加するために、t.timestampsをマイグレーションファイルに記述します。
これにより、レコードの作成日時と更新日時が自動的に管理されます。
CRUD操作を試してみる
データベースにtasksテーブルが作成されたことが確認できたので、次はCRUD操作を試してみましょう。
サーバーを起動して、ブラウザでhttp://localhost:3000/tasksにアクセスします。
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を開いて、次のようにバリデーションを追加します。
class Task < ApplicationRecord validates :title, presence: true validates :description, presence: trueendpresence: trueは、指定したカラムが空でないことを検証するバリデーションです。
これにより、タイトルと説明が空の場合はタスクを作成できなくなります。
では、再度タスクを作成してみましょう。
タイトルと説明を空にしてCreate Taskボタンをクリックすると、
次のようなエラーメッセージが表示されます。

これで、タイトルと説明が必須であることが検証され、空の場合はタスクを作成できなくなりました。
CRUD操作の全体像
CRUD操作の全体像を確認してみましょう。

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