🍎
【初心者】Active Recordの初歩(ソフトウェアアーキテクチャパターンとの違い)
状況
- そろそろ初心者のフリしてなんでも教えてもらえる期間が過ぎるので、焦って基本を勉強し直しているエンジニアです
- 前回の記事で「ソフトウェアアーキテクチャパターン」を学びました ↓
- が、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つのテーブルを表す
- データの取得・保存・更新・削除をオブジェクト指向的に操作できる
- SQLを書かずにデータ操作ができる
- バリデーション(データの検証)や関連付け(アソシエーション)を簡単に定義できる
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を書かなくていい |
SELECT や INSERT などのSQLを直接書かなくても、メソッドで操作できる |
オブジェクト指向的に扱える | データをクラスとインスタンスとして扱える |
バリデーションが簡単 |
validates を使えば、データの検証が簡単にできる |
リレーション(関連付け)が簡単 |
has_many や belongs_to でテーブルの関係を定義できる |
Active Recordのバリデーション(データの検証)
例えば、記事のタイトルを必須にする場合は、
class Article < ApplicationRecord
validates :title, presence: true
end
これにより、title
が空の場合に save
や create
が失敗するように
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の注意点
-
複雑なクエリはSQLの方が効率的な場合がある
-
joins
やselect
を使わないと、意図しないN+1問題が発生することがある -
includes
やeager_load
を適切に使う必要がある
-
-
ビジネスロジックを詰め込みすぎると肥大化する
- 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ガイドを読んで更なる理解を深めてまいりたいです。
- そういえば前に書いたフォームオブジェクトとも関わってくる分野でしたので、紹介させていただきます。
Discussion