すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Railsでデータ操作の基本(CRUD)をマスターしよう

この記事で出来るようになること

はじめに

概要

この記事では、Ruby on Railsフレームワークを使用して、データベース操作の基本であるCRUD(Create, Read, Update, Delete)の各プロセスを実行する方法を学びます。Railsの強力なORM(オブジェクトリレーショナルマッピング)システムであるActiveRecordを活用し、データの作成、読み出し、更新、削除を行うための具体的な手法を紹介します。

各セクションでは、create、new/save、all、find、find_by、where、update、destroyなどのメソッドを用いた効果的なデータ操作の例を詳しく解説し、Railsにおけるデータベース管理の基本を習得することを目指します。

目標

この章の目標
  • ActiveRecordを使用してRailsでデータベースのCRUD操作を理解し、実践する。
  • データベースでのデータの作成、読み出し、更新、削除のためのメソッドを学ぶ。
  • Railsアプリケーションでのデータ管理の基本を習得し、より効率的なデータ操作を実現する。

必要な前提条件・事前準備

Railsでのデータ操作の基本を学ぶためには、いくつかの事前準備が必要です。まず、前章「Railsでのデータベース設計と操作を学ぼう」を完了していることが前提です。この知識は、本章で学ぶ内容を理解する上での基盤となります。また、本章でのデータ操作にはRailsコンソールの使用が伴いますので、その起動方法についても事前に確認しておきましょう。

必要なもの・知識

以下の手順に従って、Railsコンソールの起動方法を確認しましょう。これにより、CRUD操作をコンソール上で実践的に学ぶ準備が整います。

Railsコンソールの起動方法

データ操作は、コンソール上で行います。Railsでは、consoleコマンドでコンソールを起動させて、Railsアプリケーションとコマンドラインでやり取りすることができます。

Webにアクセスすることなく、サーバーのデータを変更するときやメソッドを試すときに便利です。内部ではirbが使われているので、同じように操作を行えます。

ターミナル | コンソールを起動させる
1
2
rails console
# rails c でも可能

コンソールを起動させる

他にもオプションの-sandboxを付けることで、終了時にコンソールで変更したデータを元に戻すことができます。

ターミナル | Sandboxモードでコンソールを起動させる
1
2
rails console -sandbox
# rails c -s でも可能

上記のコマンドを実行すると、下の画像のようにin sandboxが表示されます。

Sandboxモードのコンソールを起動

コンソールを終了するには、exitquitを実行します。

コンソール | コンソールを終了する
1
2
3
exit
#もしくは、以下を実行する
quit

今回は、実際にデータベースにデータを反映させていくので、Sandboxモードではなく、通常モードでコンソールを起動させます。

ぴかわかさん
コンソールを起動してみましょう

以下のコマンドを実行して、コンソールを起動してください。

employee_managementディレクトリへ移動
1
cd ~/environment/employee_management
~/environment/employee_management | 通常モードのコンソールを起動
1
rails c

上記のコマンドを実行すると、以下のように表示されます。

コンソールを起動させる

ActiveRecordによるCRUD操作の基礎

ActiveRecordは、CRUDの機能を提供します。

CRUDとは、Create(作成)・Read(読み込み)・Update(更新)・Delete(削除)の頭文字を繋げた用語で、データ操作の基本となる4つの処理のことでしたね。

SQLでは、CRUDに対応するデータ操作言語のキーワードとしてINSERTSELECTUPDATEDELETEが用意されており、これらを利用してデータ操作を学習しました。

CRUD SQL文 SQL文の説明
Create(作成) INSERT文 テーブルにレコードを挿入する
Read(読み込み) SELECT文 テーブルのレコードを抽出する
Update(更新) UPDATE文 テーブルのレコードを更新する
Delete(削除) DELETE文 テーブルのレコードを削除する

Railsでは、ActiveRecordを通じてCRUD(Create、Read、Update、Delete)に対応する多くの便利なメソッドが提供されています。これにより、開発者はデータベースとのやり取りを効率的に行うことが可能です。

ActiveRecordが提供するメソッドやクラスの使用によって、Railsでは「オブジェクトを操作するようにデータを操作する」ことが可能になります。実際のデータ操作メソッドに入る前に、この基本的なコンセプトをしっかりと理解しましょう。

ぴかわかさん

オブジェクトによるデータ操作

前章で少し触れましたが、ActiveRecordでは「モデルのクラス」と「データベースのテーブル」が1対1で紐付けられます。

例えば、以下のようにモデルのUserクラスの場合は、データベースのusersテーブルに紐付きます。

例 | app/models/user.rb
1
2
class User < ApplicationRecord
end

Userモデルに対応するテーブル

ActiveRecordでは、「モデル」と「テーブル」の間だけでなく、「モデルのインスタンス」と「テーブルのレコード」、モデルのインスタンスの「属性(またはプロパティ)」と「テーブルのカラム」も1対1で対応付けられます。

モデルクラスのインスタンスは、テーブルのレコード1件に対応するオブジェクトになり、オブジェクトのプロパティは、テーブルのカラムに対応します。

1対1の関係

Rubyのクラスとインスタンスの章で学習しましたが、インスタンスを生成するには、クラスに対して「newメソッド」を呼び出します。

クラスのインスタンスを生成する
1
クラス名.new

モデルクラスの場合でも、同じように「newメソッド」を呼び出してインスタンスを生成します。しかし、通常のクラスとは違って生成されたインスタンスは、「テーブルのレコード1件」に対応するオブジェクトになります。

モデルクラスのインスタンスを生成する
1
2
モデルのクラス名.new 
#レコード1件に対応するオブジェクトになる

モデルクラスのインスタンス(オブジェクト)に対して、ActiveRecordが提供するメソッドを利用することで、テーブルにレコードを挿入したり、更新や削除などが行えます。まさにオブジェクトを操作するように、データ操作ができます。

例えば、Userモデルクラスのインスタンスに対して、ActiveRecordが提供するsaveメソッドを呼び出せば、テーブルにデータを挿入することができます。

usersテーブルに1件のレコードを挿入する
1
2
3
4
5
# Userモデルのインスタンスをuserに代入する
user = User.new(name: "山田花子", age: 34)

# saveメソッドでインスタンスをデータベースに保存する
user.save

メソッドの箇所で詳しく説明しますが、モデルのクラスに対してnewメソッドを呼び出した時点では、「テーブルのレコード1件」に対応するオブジェクトが生成されただけです。実際にデータベースに保存するのは、saveメソッドが行います。

SQLではINSERT構文を使用して、テーブルに新しいレコードを挿入しましたが、RailsではActiveRecordのお陰で、オブジェクトを操作するようにデータ操作が可能になります。

SQLの場合
1
INSERT INTO users(name, age) VALUES('山田花子', 34);
Railsの場合
1
2
user = User.new(name: "山田花子", age: 34)
user.save

ちなみにモデルのインスタンスに対してsaveメソッドを呼び出すと、裏側では以下のようなSQL文が発行されます。実際にはINSERT構文を使用して、テーブルにレコードを挿入していることがわかりますね。

Railsの場合
1
2
3
4
user = User.new(name: "山田花子", age: 34)

user.save
# INSERT INTO `users` (`name`, `age`, `created_at`, `updated_at`) VALUES ('山田花子', 34, '2023-03-24 07:47', '2023-03-24 07:47'

newメソッドを呼び出した時点で特に指定されてないcreated_atupdated_atの値は、発行されるSQL文により、「レコード作成時に現在の日時を自動的に設定する」ということを確認できます。

ActiveRecordの主要なメソッドとそれぞれのCRUD操作の関係は、次の表にまとめられています。

メソッド 説明 CRUD
new クラスのインスタンスを生成する(saveメソッドを使用して保存する) Create
save モデルのインスタンスをデータベースに保存する Create
create モデルのインスタンスの生成と同時にデータベースに保存する Create
all 全てのレコードを取得する Read
find 「ID」に当てはまるレコードを全て取得する Read
find_by 「条件」を指定して最初の1件を取得する Read
where 「条件」に当てはまるレコードを全て取得する Read
update 既存のレコードを引数に指定するプロパティ値に更新する Update
destroy 既存のレコードを削除する Delete
destroy_all 指定した条件のレコードと関連しているレコードをすべて削除する Delete

これらのCRUDに対応するメソッドを1つずつ詳しく学んでいきましょう。

ぴっかちゃん

CRUDのメソッドってたくさんあるみたい。ちゃんと理解できるかなあ…。

大丈夫、ここでは基本的なメソッドだけをおさえるよ。SQLはすでに学んだから、裏側でどんなSQL文が発行されているかを見ると、メソッドの動作がよく理解できるよ。

ぴかわかさん

データの作成(Create)

Createは、「テーブルにレコードを挿入する」というデータ操作の基本処理を指します。

Railsの場合は、ActiveRecordが提供するsaveメソッド、createメソッドを利用することで、テーブルにレコードを挿入することができます。

メソッド 説明
new クラスのインスタンスを生成する(saveメソッドを使用して保存する)
save モデルのインスタンスをデータベースに保存する
create モデルのインスタンスの生成と同時にデータベースに保存する

createメソッドの使い方

createメソッドは、モデルのインスタンス生成と同時にデータベースに保存するクラスメソッドです。

Userモデルにnameとageというプロパティがある場合、Userモデルのクラスに対してcreateメソッドを呼び出すと、新しいレコードが1件作成され、データベースに保存されます。

モデルのインスタンスを生成して保存
1
モデルのクラス名.create(カラム名1: 1, カラム名2: 2)
例 | Userモデルのインスタンス生成して保存
1
User.create(name: "山田花子", age: 34)
createメソッドを利用して、departmentsテーブルに1件のレコードを挿入しましょう

以下をコンソールで実行し、nameカラムの値が"開発"のレコードをdepartmentsテーブルに挿入しましょう。

コンソール | Departmentモデルのインスタンス生成して保存
1
Department.create(name: "開発")

上記を実行すると、以下のように裏側でSQL文が発行されます。SQLの章で学習したようにINSERT構文で、テーブルに新しいレコードを挿入していることがわかりますね。

created_atupdated_atには、現在の日時が自動的に設定されます。

テーブルに新しいレコードを挿入

phpMyAdminで確認すると、以下のようにdepartmentsテーブルにnameカラムの値が開発のレコードが1件挿入されています。また、idも自動的に値が入っていますね。

newメソッドとsaveメソッドの組み合わせ

saveメソッドは、モデルのインスタンスをデータベースに保存します。

createメソッドとは違い、saveメソッドはインスタンスを生成しません。そのため、インスタンス生成を行うnewメソッドとセットで利用します。

newメソッドとsaveメソッドの使い方
1
2
3
4
5
 # Userモデルのインスタンスを生成して、userに代入する
user = User.new(name: "山田花子", age: 34)

# saveメソッドでインスタンスをデータベースに保存する
user.save

モデルのクラスに対してnewメソッドを呼び出した時点では、「テーブルのレコード1件」に対応するオブジェクトが生成されただけです。実際にデータベースに保存するのは、saveメソッドが行います。

saveメソッド

レコードに挿入する値は、最初のコードのようにnewメソッドの引数にハッシュで一度に指定することもできますし、あとのコードのように指定することもできます。

レコードに挿入する値のセット方法
1
2
user = User.new(name: "山田花子", age: 34)
user.save
レコードに挿入する値のセット方法
1
2
3
4
5
user = User.new

user.name = "山田花子"
user.age = 34
user.save
new/saveメソッドで、departmentsテーブルに1件のレコードを挿入しましょう

nameカラムの値が"営業"のレコードをdepartmentsテーブルに挿入してみます。

まずは、newメソッドを利用して、Departmentモデルのインスタンスを生成します。以下のコードをコンソールに記述し、実行しましょう。

コンソール | Departmentモデルのインスタンスを生成する
1
department = Department.new(name: "営業")

上記を実行すると、以下のようにDepartmentモデルのインスタンスが生成されます。この時点では、newメソッドの引数で指定したname属性のみ値が設定されており、idやcreated_atとupdated_atの属性値は、いずれもnilで値が何も入っていない状態です。

Departmentモデルのインスタンスを生成

続いて、生成したDepartmentモデルのインスタンスをsaveメソッドでデータベースに保存します。以下のコードをコンソールに記述し、実行しましょう。

コンソール | 生成したインスタンスをデータベースに保存する
1
department.save

上記を実行すると、以下のように裏側でSQL文が発行されます。INSERT構文で、テーブルに新しいレコードを挿入していることがわかりますね。

created_atupdated_atには、現在の日時が自動的に設定されます。

生成したインスタンスをデータベースに保存する

phpMyAdminで確認すると、以下のようにdepartmentsテーブルにnameカラムの値が営業のレコードが1件挿入されています。また、idも自動的に値が入っていますね。

phpMyAdminで確認

そして、Departmentモデルのインスタンスが入るdepartmentをコンソールで実行すると、以下のようにnewメソッドを呼び出した時点では、nilだった属性値に値が設定されていることがわかります。

departmentを実行

idには2という値が設定され、created_atやupdated_atには、saveメソッドを実行した際の日時、つまりレコードを作成した現在の日時が設定されます。

複数レコードの一括挿入

データベースに複数のレコードを一度に挿入する方法はいくつか存在しますが、ここでは配列とハッシュを組み合わせて使用するcreateメソッドによる一括挿入を学習しましょう。

createメソッドでは、1件のレコードをデータベースに挿入することができましたね。

モデルのインスタンスを生成して保存
1
モデルのクラス名.create(カラム名1: 1, カラム名2: 2)

複数のレコードをデータベースに挿入させるには、配列の要素にハッシュを指定します。

モデルのインスタンスを複数生成して保存する場合
1
2
3
4
5
モデルのクラス名.create([
  { カラム名1: 1 }, # 1件目のレコード
  { カラム名2: 2 }, # 2件目のレコード
  { カラム名3: 3 }  # 3件目のレコード
])
employeesテーブルに複数レコードを同時に挿入してみましょう

employeesテーブルに挿入するデータは、以下の通りです。

id name birthday department_id
1 田中太郎 1980-10-22 1
2 山田花子 1983-08-20 1
3 高橋一朗 1986-06-16 2
4 伊藤晴子 1987-10-01 1
5 鈴木二郎 1990-01-17 2
6 山口冬子 1993-05-12 2

employeesテーブルに複数レコードを挿入するために、以下のコードをコンソールに記述し、実行しましょう。

コンソール
1
2
3
4
5
6
7
8
Employee.create([
  { name: '田中太郎', birthday: '1980-10-22', department_id: 1 },
  { name: '山田花子', birthday: '1983-08-20', department_id: 1 },
  { name: '高橋一朗', birthday: '1986-06-16', department_id: 2 },
  { name: '伊藤晴子', birthday: '1987-10-01', department_id: 1 },
  { name: '鈴木二郎', birthday: '1990-01-17', department_id: 2 },
  { name: '山口冬子', birthday: '1993-05-12', department_id: 2 }
])

上記を実行すると、以下のように裏側でSQL文が発行されます。INSERT構文で、テーブルに新しいレコードを6件挿入していることがわかりますね。

レコードを6件挿入

phpMyAdminでemployeesテーブルを表示して、createメソッドで指定した6件のレコードがテーブルに挿入されていることを確認しましょう。

phpMyAdminで確認

データの読み込み(Read)

Readは、「テーブルのレコードを抽出する」というデータ操作の基本処理を指します。

Railsの場合は、ActiveRecordが提供するallメソッド、findメソッドなどを利用することで、テーブルのレコードを抽出することができます。

メソッド 説明
all 全てのレコードを取得する
find 「ID」に当てはまるレコードを全て取得する
find_by 「条件」を指定して最初の1件を取得する
where 「条件」に当てはまるレコードを全て取得する

allメソッド(全レコードの取得)

モデルのクラスに対してallメソッドを呼び出すと、モデルに対応するテーブルのレコードをすべて取得します。

モデルに対応するテーブルのレコードをすべて取得
1
モデルのクラス名.all

例えば、usersテーブルのレコードを全て取得する場合はUser.allと記述します。

usersテーブルのレコードをすべて取得する
1
User.all

usersテーブルのレコードをすべて取得する

employeesテーブルのレコードをすべて取得しましょう

employeesテーブルの全てのレコードを取得してみます。

employeesテーブルの全てのレコードを取得

以下のコードをコンソールに記述し、実行しましょう。

コンソール | employeesテーブルのレコードをすべて取得する
1
Employee.all

上記を実行すると、以下のように裏側でSQL文が発行されます。SQLの章で学習したようにSELECT構文で、テーブルのすべてのレコードを抽出していることがわかりますね。

戻り値には、employeesテーブルの全てのレコードが設定されています。

テーブルのレコードを抽出

findメソッド(特定レコードの検索)

findメソッドは、引数の主キーに対応するレコードを取得するクラスメソッドです。

findメソッドの引数には1つの主キーだけではなく、配列で複数の主キーの値を指定して、レコードを取得することもできます。

主キー値に対応するレコードを取得する
1
モデルのクラス名.find(主キー値)
配列で複数の主キー値を指定する場合
1
モデルのクラス名.find([主キー値1, 主キー値2])

テーブルの主キーは、idというカラム名がデフォルトで使われます。

例えば、以下のようにUser.find(1)と指定する場合、Userモデルに対応するusersテーブルの主キー、つまりidの値が1のレコードを取得します。

例 | idの値が1のレコードを取得する
1
User.find(1)

主キーが1のレコードを取得する

以下のように指定すると、idの値が12のレコードを取得します。

例 | idの値が1と2のレコードを取得する
1
User.find([1,2])
employeesテーブルのidの値を指定してレコードを取得してみましょう

employeesテーブルのidの値が4のレコードを取得してみます。

idの値が4のレコードを取得

以下のコードをコンソールに記述し、実行しましょう。

コンソール | 主キー値が4のレコードを取得する
1
Employee.find(4)

上記を実行すると、以下のように裏側でSQL文が発行されます。SELECT構文で、employeesテーブルのidの値が4のレコードを抽出していることがわかりますね。

戻り値は、取得したデータの値がセットされているEmployeeモデルのインスタンスです。

Employeeモデルのインスタンス

find_byメソッド(条件付き単一レコードの検索)

find_byメソッドは、引数の条件に当てはまる最初の1件のレコードを取得するクラスメソッドです。

引数の条件は、ハッシュで指定します。

条件を指定して最初の1件のレコードを取得する
1
モデルのクラス名.find_by(条件)
田中太郎という名前を持つ最初の1件を取得する
1
User.find_by(name: '田中太郎')
条件を指定してemployeesテーブルから最初の1件のレコードを取得しましょう

employeesテーブルのnameの値が'鈴木二郎'のレコードを取得してみます。

employeesテーブルから最初の1件のレコードを取得

以下のコードをコンソールに記述し、実行しましょう。

鈴木二郎という名前を持つ最初の1件を取得する
1
Employee.find_by(name: '鈴木二郎')

上記を実行すると、以下のように裏側でSQL文が発行されます。SELECT構文で、employeesテーブルのnameの値が'鈴木二郎'のレコードを抽出していることがわかりますね。

戻り値は、取得したデータの値がセットされているEmployeeモデルのインスタンスです。

鈴木二郎という名前を持つ最初の1件を取得する

whereメソッド(条件検索)

whereメソッドは、引数の条件に当てはまるレコードを全て取得するクラスメソッドです。

引数の条件に当てはまるレコードを全て取得する
1
モデルのクラス名.where(条件)

find_byメソッドの場合は、引数の条件に当てはまる最初のレコードを1件だけ取得しますが、whereメソッドは、条件に当てはまる全てのレコードを取得します。

例えばUser.where(age: 20)User.find_by(age: 20)のように、引数に同じ条件を指定しても、取得するレコード数は違います。

年齢が20歳のレコードをusersテーブルから全て取得する
1
User.where(age: 20)
年齢が20歳の最初のレコードを1件取得する
1
User.find_by(age: 20)

以下のようにUser.where(age: 20)は、age20のレコードを全て取得します。

whereとfind_byの違い

引数の条件に当てはまるレコードをemployeesテーブルから全て取得しましょう

employeesテーブルのdepartment_idの値が2のレコードをすべて取得してみます。

department_idが2のレコードを全て取得する

以下のコードをコンソールに記述し、実行しましょう。

コンソール | department_idの値が2のレコードを全て取得する
1
Employee.where(department_id: 2)

上記を実行すると、以下のように裏側でSQL文が発行されます。SELECT構文で、employeesテーブルのdepartment_idの値が2のレコードを抽出していることがわかりますね。

戻り値には、条件に当てはまるemployeesテーブルの全てのレコードが設定されています。

戻り値

データの更新(Update)

Updateは、「テーブルのレコードを更新する」というデータ操作の基本処理を指します。

Railsの場合は、ActiveRecordが提供するupdateメソッドなどを利用することで、テーブルのレコードを更新することができます。

メソッド 説明
update 既存のレコードを引数に指定するプロパティ値に更新する

saveメソッド(変更内容の保存)

更新対象のオブジェクトを取得すると、オブジェクトのプロパティを変更し、その結果をデータベースに保存できるようになります。

例えば、以下のようにfind_byメソッドで更新対象のオブジェクトを取得し、nameプロパティ値を'田中太郎'から'田中航太郎'に変更します。変更後、saveメソッドを呼び出して、データベースに保存します。

saveメソッドを利用して更新処理を行う場合
1
2
3
user = User.find_by(name: '田中太郎') #更新対象のオブジェクトを取得
user.name = '田中航太郎' #プロパティを変更
user.save #データベースに保存する

saveメソッドを利用する場合

updateメソッドを利用すると、上のコードを短く書けるよ!

ぴかわかさん

updateメソッド(レコードの更新)

updateメソッドを利用する場合も、あらかじめfindメソッドやfind_byメソッドなどで、オブジェクトを取得してから更新処理を行います。

updateメソッドの引数にプロパティ名と設定したい値をハッシュで対応付けます。

更新対象のオブジェクトのプロパティを引数の値に更新する
1
更新対象のオブジェクト.update(プロパティ名: )

先ほどのsaveメソッドと同様に'田中太郎''田中航太郎'に更新する場合は、更新対象のオブジェクトを取得後、以下のようにupdateメソッドの引数を指定します。

updateメソッドを呼び出すと、更新対象のオブジェクトのプロパティを引数の値に更新し、その結果をデータベースに保存します。

updateメソッドを利用して更新処理を行う場合
1
2
user = User.find_by(name: '田中太郎')
user.update(name: '田中航太郎')

updateメソッド

updateメソッドを利用して、既存のレコードのカラムを新しい値に更新しましょう

employeesテーブルにある山口冬子さんの生年月日、birthdayの値を1993-05-12から1993-12-12に更新してみます。

updateメソッドで更新する

以下のコードをコンソールに記述し、実行しましょう。

コンソール | birthdayの値を1993-05-12から1993-12-12に更新する
1
2
employee = Employee.find_by(name: '山口冬子')
employee.update(birthday: '1993-12-12')

上記を実行すると、以下のように裏側でSQL文が発行されます。SQLの章で学習したように、既存のレコードのカラムを新しい値に更新するには、UPDATE構文が使用されます。

SET句には変更するカラム名と新しい値、WHERE句にはどのレコードを更新するかを識別する条件が指定されており、id6のレコードのbirthday'1993-12-12'に更新していることがわかりますね。

updateメソッド2

また、レコードの更新時に現在の日時を設定するupdated_atの値も自動的に更新されます。データが更新されると、戻り値としてtrueを返します。

更新後のオブジェクトを確認してみましょう

オブジェクトのプロパティ値が更新されていることを確認してみましょう。更新対象のオブジェクトを保持するemployeeをコンソールに記述し、実行しましょう。

コンソール | オブジェクトのプロパティが更新されていることを確認する
1
employee

上記を実行すると、以下のように更新後のbirthdayのプロパティ値は、更新前と比べてupdateメソッドに指定した値に変更されていることがわかりますね。

update3

データベースも更新されているか確認してみましょう

phpMyAdminを再読み込みして、employeesテーブル内の山口冬子さんのbirthday1993-05-12から1993-12-12に更新されていることを確認しましょう。

また、updated_atの値も更新した日時に変更されたかを確かめてみてください。

update4

データの削除(Delete)

Deleteは、「テーブルのレコードを削除する」というデータ操作の基本処理を指します。

Railsの場合は、ActiveRecordが提供するdestroyメソッド、destroy_allメソッドなどを利用することで、テーブルのレコードを削除することができます。

メソッド 説明
destroy 既存のレコードを削除する
destroy_all 指定した条件のレコードと関連しているレコードをすべて削除する

destroyメソッド(レコードの削除)

destroyメソッドを利用する場合、あらかじめfindメソッドやfind_byメソッドなどで、オブジェクトを取得してから削除処理を行います。

削除対象のオブジェクトに対して、destroyメソッドを呼び出します。

destroyメソッドでオブジェクトを削除する
1
削除対象のオブジェクト.destroy

例えば、usersテーブルのnameカラムの値が'田中太郎'のレコードを削除するには、以下のように、まずオブジェクトを取得します。そして、取得したオブジェクトに対してdestroyメソッドを呼び出し、データベースからレコードを削除します。

destroyメソッドでレコードを削除する
1
2
user = User.find_by(name: '田中太郎') #削除対象のオブジェクトを取得する
user.destroy #レコードを削除する

destroyメソッド

destroyメソッドを利用して、既存のレコードを削除してみましょう

employeesテーブルにあるnameカラムの値が'山口冬子'のレコードを削除してみます。

レコードを削除する

以下のコードをコンソールに記述し、実行しましょう。

コンソール | nameカラムの値が'山口冬子'のレコードを削除する
1
2
employee = Employee.find_by(name: '山口冬子')
employee. destroy

上記を実行すると、以下のように裏側でSQL文が発行されます。SQLの章で学習したように、テーブル内の既存のレコードを削除するには、DELETE構文が使用されます。

既存のレコードを削除

テーブル内のレコードが削除されているかを確認しよう

phpMyAdminを再読み込みして、employeesテーブルにあるnameの値が'山口冬子'のレコードが削除されていることを確かめてみましょう。

テーブルを確認する

destroy_allメソッド(一括削除)

モデルのクラスに対してdestroy_allメソッドを呼び出すと、モデルに対応するテーブルのレコードをすべて削除します。

モデルに対応するテーブルのレコードを全て削除する
1
モデルのクラス名.destroy_all

usersテーブルのレコードを全て削除する場合は、User.destroy_allと記述します。

usersテーブルの全てのレコードを削除する
1
User.destroy_all

usersテーブルの全てのレコードを削除する

destroy_allメソッドを利用して、テーブルのレコードを全て削除しましょう

以下のコードを上から順番にコンソールで実行し、employeesテーブルのレコードから削除するようにしましょう。

employeesテーブル内にあるレコードを全て削除する
1
Employee.destroy_all
departmentsテーブル内にあるレコードを全て削除する
1
Department.destroy_all
テーブル内のレコードが全て削除されたかを確認しましょう

phpMyAdminを再読み込みして、departmentsテーブルとemployeesテーブル内のレコードが全て削除されたかを確認しましょう。

departmentsテーブル

employeesテーブル

この章のまとめ

この章では、Railsでのデータ操作の基礎、特にCRUD(Create、Read、Update、Delete)操作に関する学習を行いました。ActiveRecordを活用した効率的かつ直感的なデータベース操作方法を理解し、実践する技術を習得しました。これにより、Railsアプリケーション開発のための重要な基礎が築かれました。

次の章に進む前に、以下のコマンドを実行して環境をリセットしておきましょう。この章をもう一度学習したい方は、以下のコマンドを実行した後、「ActiveRecordによるCRUD操作の基礎」から取り組んでみてください。

アプリケーションのルートディレクトリに移動しましょう
ターミナル
1
cd ~/employee_management
データベースを作り直しましょう
データベースを作り直しましょう
1
rails db:migrate:reset

この章のまとめ

  • Railsでは、ActiveRecordを通じてCRUD(Create、Read、Update、Delete)に対応する多くの便利なメソッドが提供される
  • これらのメソッドを使用することで、データベースとの効率的なやり取りを行うことができる