【あくてぃぶれこーどぱたーん】
アクティブレコードパターン とは?
最終更新:
💡 行を表すオブジェクトが、データと保存を扱う
データベースの行を表すオブジェクトに、データ・保存や取得の処理・関連する業務ロジックを持たせる設計パターン。Railsの例、保存前後、Data Mapperとの違いを解説します。
📌 このページのポイント
アクティブレコードは、データベースの行が勝手に動くもの?
RailsのActive Recordと、同じ意味?
属性を変えた瞬間に、データベースにも保存される?
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というライブラリ名と、一般的な設計パターンの名前を区別します。