🍎

【初心者】Active Recordの初歩(ソフトウェアアーキテクチャパターンとの違い)

2025/02/15に公開

状況

  • そろそろ初心者のフリしてなんでも教えてもらえる期間が過ぎるので、焦って基本を勉強し直しているエンジニアです
  • 前回の記事で「ソフトウェアアーキテクチャパターン」を学びました ↓

https://zenn.dev/tatsuki_otake/articles/7f613f0d74d274

  • が、Active Recordとの関係性がまだよくわかっていないので、今回は「Active Recordとの関係性」を視点に学んでいきたいと思います。

内容

  • そもそも、Railsにおけるソフトウェアアーキテクチャパターンの代表例といえば「Active Record」と思っていたのですが、
  • 「Active Record」は ソフトウェアアーキテクチャパターンの一種 であり、Rails の「アーキテクチャ全体」ではなく、「データの扱い方」に関する設計パターンとのことでした。

つまり、

  • Rails全体のアーキテクチャ → MVC(Model-View-Controller)
  • Railsのデータ管理の方法 → Active Recordパターン

のように整理すると分かりやすかったです。


Active Recordとは?

  • Active Record は、 データベースとオブジェクト(モデル)を1対1で対応させるデザインパターン
  • Rails では、 ActiveRecord というライブラリを使って、このパターンが実装されている

Active Recordの特徴

  1. モデル = データベースの1つのテーブルを表す
  2. データの取得・保存・更新・削除をオブジェクト指向的に操作できる
  3. SQLを書かずにデータ操作ができる
  4. バリデーション(データの検証)や関連付け(アソシエーション)を簡単に定義できる

Active Recordの基本的な使い方(Rails)

1. モデルとテーブルの対応
Rails では、 Article モデルを作ると、 articles テーブル に対応する

class Article < ApplicationRecord
end

この Article クラスを通じて、articles テーブルのデータを扱える

2. データの作成

article = Article.new(title: "Railsとは", body: "Railsの説明")
article.save  # データベースに保存

または、1行で書くことも

Article.create(title: "Railsとは", body: "Railsの説明")

3. データの取得

article = Article.find(1)  # IDが1のレコードを取得
puts article.title  # "Railsとは"

条件を指定して検索もできる

Article.where(title: "Railsとは")  # titleが"Railsとは"のレコードを取得

4. データの更新

article = Article.find(1)
article.title = "Railsガイド"
article.save  # データベースを更新

1行で書く方法は

Article.find(1).update(title: "Railsガイド")

5. データの削除

article = Article.find(1)
article.destroy  # データを削除

または

Article.find(1).destroy

Active Recordのメリット

メリット 説明
SQLを書かなくていい SELECTINSERT などのSQLを直接書かなくても、メソッドで操作できる
オブジェクト指向的に扱える データをクラスとインスタンスとして扱える
バリデーションが簡単 validates を使えば、データの検証が簡単にできる
リレーション(関連付け)が簡単 has_manybelongs_to でテーブルの関係を定義できる

Active Recordのバリデーション(データの検証)

例えば、記事のタイトルを必須にする場合は、

class Article < ApplicationRecord
  validates :title, presence: true
end

これにより、title が空の場合に savecreate が失敗するように

article = Article.new(body: "本文だけ")
article.save  # false(保存されない)

Active Recordのアソシエーション(リレーション)

テーブル同士の関係を簡単に定義できる

1対多の関係(例:ユーザーと記事)

class User < ApplicationRecord
  has_many :articles
end

class Article < ApplicationRecord
  belongs_to :user
end

この設定をすると、ユーザーが複数の記事を持てるようになる

user = User.find(1)
user.articles  # ユーザーが書いた記事を取得

Active Recordの注意点

  1. 複雑なクエリはSQLの方が効率的な場合がある

    • joinsselect を使わないと、意図しないN+1問題が発生することがある
    • includeseager_load を適切に使う必要がある
  2. ビジネスロジックを詰め込みすぎると肥大化する

    • Fat Model(モデルが肥大化する問題)になりやすい
    • Serviceクラス を導入して、ロジックを分けることが推奨される
      ※詳しくは本記事最上段で紹介してる「ソフトウェアアーキテクチャパターン」の記事の「レイヤードアーキテクチャ」ご参照

他の言語でのActive Recordパターン

Active Record は Rails 以外の言語でも使われています。

言語 フレームワーク / ライブラリ
Java Hibernate (JPA)
Python Django ORM
PHP Laravel Eloquent
JavaScript Sequelize (Node.js)
Go GORM

例えば、Django(Python)では、Active Record に似た ORM が使える

class Article(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()

このように、各フレームワークで Active Record の考え方が使われている

まとめ

項目 説明
Active Record とは? データベースの1テーブルを1クラスとして扱う設計パターン
Rails における実装 ActiveRecord ライブラリを利用
メリット SQLを書かずにデータ操作ができる、オブジェクト指向的に扱える
注意点 クエリの最適化が必要、ビジネスロジックを詰め込みすぎない

所見

  • Railsの便利さの一つにActive Recordが上がる理由がなんとなく分かりました
  • とはいえまだまださわりの部分だと思うので、Railsガイドを読んで更なる理解を深めてまいりたいです。
  • そういえば前に書いたフォームオブジェクトとも関わってくる分野でしたので、紹介させていただきます。

https://zenn.dev/tatsuki_otake/articles/0a155b170351ee

Discussion