【あくてぃぶれこーどぱたーん】

アクティブレコードパターン とは?

最終更新:
💡 行を表すオブジェクトが、データと保存を扱う

データベースの行を表すオブジェクトに、データ・保存や取得の処理・関連する業務ロジックを持たせる設計パターン。Railsの例、保存前後、Data Mapperとの違いを解説します。

📌 このページのポイント
アクティブレコード:データと保存User オブジェクトid = 1 / name = ひよこデータ・保存などの処理そのデータに関係する業務ロジックsaveで保存users テーブルの行1 | ひよこ属性を変えることと、保存することは別
Railsの保存例。保存が成功した場合の行を示しています。検証・制約・接続などで保存が失敗する場合もあり、新規オブジェクトはまだ対応する行がないこともあります。
ひよこ ひよこ
アクティブレコードは、データベースの行が勝手に動くもの?
ペンギン先生 ペンギン先生
行を表すオブジェクトに、データと保存・取得などの処理を持たせる設計だよ。データアクセスや関連する業務ロジックを、行を扱うオブジェクトにまとめるんだ。
ひよこ ひよこ
RailsのActive Recordと、同じ意味?
ペンギン先生 ペンギン先生
RailsのActive Recordは、そのパターンを実装するORMだよ。設計の考え方と、特定のライブラリを区別しよう。ORMのすべてが同じ設計パターンを採るわけでもないんだ。
ひよこ ひよこ
属性を変えた瞬間に、データベースにも保存される?
ペンギン先生 ペンギン先生
Railsで属性を代入する操作と、saveで保存する操作は別だよ。たとえばuser.nameを変えてからuser.saveで更新する。新しく作ったオブジェクトは、保存されるまで対応する行がないこともあるんだ。
ひよこ ひよこ
saveを呼べば、必ず保存できる?
ペンギン先生 ペンギン先生
Railsでは検証に失敗するとsaveがfalseを返す場合があるよ。save!は検証失敗を例外として扱う。制約違反や接続の問題などもあるので、保存の結果と失敗時の動作を確認しよう。
ひよこ ひよこ
大きなシステムでは、必ず別のパターンに変える?
ペンギン先生 ペンギン先生
規模だけで決めるものではないよ。データアクセスと業務ロジックを分離したい場合にはData Mapperなどの考え方がある。今の責任の分け方や変更のしやすさ、テストで確かめたい範囲に合わせて設計しよう。
もっと詳しく知りたい人へ

リポジトリパターンと、完全な二択?

Data Mapperはオブジェクトとデータベースの間の転送を分離するパターンで、Repositoryはドメイン側からの取得などをまとめる別の責任を扱います。名称だけで二択にせず、どこがデータを取得・保存し、どこに業務ルールを置くかを確認します。

Railsのdeleteとdestroyは同じ?

同じではありません。Railsではdestroyは関連するコールバックなどを実行しますが、deleteはモデルのコールバックを経由せず削除します。モデルの関連設定や検証も含め、ライブラリのメソッドの契約を確認して使います。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「アクティブレコード」って出てきたら「行を表すオブジェクトが、データとDBへのアクセスを扱う設計」と思えばだいたいOK!
📖 おまけ:英語の意味
「Active Record」 = データと振る舞いを持つレコード
💬 Martin FowlerのPatterns of Enterprise Application Architectureに記載されたパターンです。RailsのActive Recordというライブラリ名と、一般的な設計パターンの名前を区別します。

参考資料

← 用語集にもどる