第10回「Rails基礎力を固める 模擬問題で学ぶ試験対策」Active Recordの基礎

みなさん、こんにちは。

前回は、フォームとバリデーション表示を通して、ユーザーの入力がモデルに渡り、保存やエラー表示につながる流れを確認しました。今回は、その裏側にある、Railsのデータ操作の中心である Active Record を扱いましょう。

Active Record は、データベースのテーブルをRubyのクラスとして、行をオブジェクトとして扱えるようにする仕組みです。試験では、モデルとテーブルの対応、レコードの作成・取得・更新・削除、クエリメソッドの基本が問われやすい分野です。実務でも、Active Recordを理解しているかどうかで、Railsアプリケーションの読みやすさは大きく変わります。SQLをまったく意識しなくてよいという意味ではなく、RailsがどのようにSQLを包み、Rubyらしく扱える形にしているのかを知ることが大切です。

目次

Active Recordとは何か

Railsにおけるモデルの多くは ApplicationRecord を継承します。たとえば Article モデルは、articles テーブルと対応します。

class Article < ApplicationRecord
end

この短いコードだけで、Article.new、Article.find、Article.where などのメソッドが使えるようになります。Railsはクラス名 Article からテーブル名 articles を推測します。ここにも Convention over Configuration の考え方があります。Active Recordの基本は、「テーブルをクラスとして扱い、1件のレコードをインスタンスとして扱う」ことです。たとえば articles テーブルの1行は、Rubyでは Article オブジェクトとして操作できます。

レコードを作成する

レコードを作るには new と save、または create を使います。new はオブジェクトを作るだけで、save を呼ぶまでデータベースには保存されません。

article = Article.new(title: "Rails入門", body: "Active Recordを学びます")
article.save

Article.create(title: "Rails試験対策", body: "基礎を確認します")

create は new と save をまとめたようなメソッドです。ただし、バリデーションに失敗すると保存されず、戻り値のオブジェクトに errors が入ります。前回扱ったフォーム再表示は、この仕組みとつながっています。

試験では、new だけでは保存されないこと、save や create でデータベースに反映されることを区別しておきましょう。

レコードを取得する

データを取得する代表的なメソッドには find、find_by、where があります。

Article.find(1)
Article.find_by(title: "Rails入門")
Article.where(published: true)

find は主キーで1件を取得します。該当するレコードがない場合は例外が発生します。find_by は条件に合う最初の1件を返し、見つからなければ nil を返します。where は条件に合うレコードの集合を返します。これらのメソッドの違いは実務でも重要です。必ず存在する前提なら find、存在しない可能性を自然に扱いたいなら find_by、一覧や絞り込みには where、というように使い分けます。

もう一つ意識したいのは、戻り値の種類です。find や find_by は基本的に1件の Article オブジェクトを返します。一方、where は ActiveRecord::Relation という、条件を持った検索結果のようなオブジェクトを返します。配列のように each で繰り返せますが、単なる配列ではありません。この仕組みによって、Railsでは Article.where(published: true).order(created_at: :desc) のように条件をつなげて書けます。SQLを文字列で組み立てるのではなく、Rubyのメソッドを組み合わせて問い合わせを表現できる点がActive Recordらしいところです。クエリについてはあとで扱いますが、その前提としても、この感覚を持っておくと理解しやすくなります。

更新と削除の基本

既存レコードを変更するには update を使います。属性を代入してから save する書き方もできます。

article = Article.find(1)
article.update(title: "更新後のタイトル")

article.destroy

update はバリデーションを通った場合に保存されます。destroy はレコードを削除し、関連付けの設定によっては関連データにも影響します。削除は取り消しが難しい操作なので、実務では認可や確認画面と組み合わせて慎重に扱います。

このように、Active Recordは便利ですが、データベースを操作していることに変わりはありません。Railsらしく短く書ける一方で、どのコードが保存・更新・削除を発生させるのかを意識することが大切です。

モデルに置くべき責務

Active Recordモデルは、データベースの表現だけでなく、そのデータに関するルールも持ちます。たとえばバリデーションや、状態を判定する小さなメソッドはモデルに置くと自然です。

class Article < ApplicationRecord
  validates :title, presence: true

  def published?
    published_at.present?
  end
end

ビューやコントローラに判定ロジックを散らすより、モデルにまとめることで、同じルールをアプリケーションの複数の場所から使えます。これはDRYにもつながります。ただし、何でもモデルに詰め込めばよいわけではありません。まずは「そのデータ自身に関するルールかどうか」を考えると、Railsらしい責務分担を判断しやすくなります。

模擬問題

問題1

問題:

次のうち、Article.new の説明として最も適切なものを1つ選びなさい。

1. 新しいArticleオブジェクトを作成し、同時にデータベースへ保存する

2. 新しいArticleオブジェクトを作成するが、saveするまでデータベースには保存しない

3. articlesテーブルから最初の1件を取得する

4. articlesテーブルの全レコードを削除する

正解:
2

解説:
new はRubyオブジェクトを作るだけで、データベースへの保存は行いません。保存するには save を呼ぶ必要があります。1は create の説明に近く、3は取得、4は削除の説明です。試験では、オブジェクト生成と永続化を分けて理解しておくことが大切です。

問題2

問題:

find、find_by、where の使い分けとして最も適切なものを1つ選びなさい。

1. find は条件に合う複数件を返す

2. find_by は見つからない場合に必ず例外を発生させる

3. where は条件に合うレコードの集合を返す

4. where はデータベースに保存するためのメソッドである

正解:
3

解説:
where は条件に合うレコードの集合を返すため、一覧表示や絞り込みでよく使います。find は主キーで1件を取得し、見つからない場合は例外が発生します。find_by は条件に合う最初の1件を返し、見つからない場合は nil を返します。4は保存処理ではありません。

問題3

問題:

Railsらしいモデル設計として最も適切なものを1つ選びなさい。

1. titleが空かどうかの判定をすべてビューに書く

2. 記事データ自身に関するバリデーションをArticleモデルに書く

3. SQL文字列をすべてコントローラで組み立てる

4. 削除処理は認可を考えず、どのユーザーにも実行させる

正解:
2

解説:
データ自身に関するルールはモデルに置くと、複数の画面や処理から同じルールを使えます。1はビューに責務を持たせすぎています。3はRailsのクエリメソッドを活かせず、コントローラが肥大化しやすくなります。4はActive Recordの話以前に、安全なアプリケーション設計として不適切です。

まとめ

今回は、Active Recordの基礎として、モデルとテーブルの対応、レコードの作成、取得、更新、削除を整理しました。Active Recordを使うと、データベースの行をRubyオブジェクトとして扱えるため、Railsアプリケーションのコードは読みやすくなります。試験では、new と create の違い、find、find_by、where の使い分け、update や destroy がデータベースに影響することを押さえておきましょう。実務では、短く書ける便利さだけでなく、そのコードがどのSQLや保存処理につながるのかを意識することが重要です。

次回は、Active Recordモデルに書く代表的なルールであるバリデーションを詳しく扱います。入力値をどのように検証し、ユーザーに分かりやすく伝えるのかを見ていきましょう。

Rails7認定ベーシック試験について

全国300か所で通年実施しています。詳細は以下をご覧ください。

あわせて読みたい
Rails7ベーシック試験 近年、Ruby on Railsの求人情報は上昇傾向にあり、この3年間で4倍に増加しています。(2025年7月時点)この背景にあるのはコロナ禍によって非対面営業に注目が集まり、...

また、450ページを超える教科書も安価に出版しています。学習にあたってご活用ください。詳細は以下をご覧ください。

Rails 7 技術者認定ベーシック試験公式教科書ベータ版

著者:小澤昌樹 発行:Rails技術者認定試験運営委員会

価格(税込):ペーパーバック版 2,497円 Kindle版 1250円

ページ数:471ページ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次