railsのActive Recordの理解について

未分類

DDD(ドメイン駆動設計)をrailsに適用しようとした際に、そもそもActiveRecordの理解が必要であると感じた。

そもそも、Active Recordとはなんなの?というところから、DDDとActive Recordの関連性について自分なりの考えをまとめてみました。

Active Recordとは…?

色々な記事で説明されていますが、簡単にいうとrailsの書き方でSQLを実行してくれるもの。

例えば、Userモデルのデータを全件取得する処理を行いたいとする。SQLだと、

SELECT * FROM USER;

このように書くことで全件取得できるが、railsだと

User.all

で取得ができる。Active Recordのおかげで User.all は変換され、上記のSQL文が実行されて値が返される。

User.allの方が視覚的にわかりやすいし簡潔に処理を書くことができるので、便利。Active RecordのようなSQLの変換機能のことをORM(Object Relational Mapping)と呼ぶ。

発展:railsのActive Recordとドメインモデルの共存

よく、DDD(ドメイン駆動開発)とORMは衝突しがちという記事を見かけるけどなぜなのか、いまいちわからなかったので、ブログなどを参考に自分なりの解釈を残しておきます。

まず、Entityの定義について。ActiveRecordって、そもそもmodelsフォルダ配下にあるモデルファイルがEntityの役割を果たしていると思っていました。

ただ、単一モデルを使用するだけならまだしも、複数モデルのデータを使用する場合やモデルデータを加工して使用する場合は、モデルデータを使用するだけだと難しいですよね。なので基本的にmodelのentityをそのまま使うことってあまりないと思います(使えるようにDB設計しておくといいのかも…?)

そこで、考え方としては下記記事のような設計が望ましいのかなと思います。

ドメイン駆動設計の比類なきパワーでRailsレガシーコードなど大爆殺したるわあああ!!! - Qiita
この記事は クラウドワークスアドベントカレンダー2019 12日目の記事です。概要こんにちは、怒り駆動リファクタリングを生業としている @MinoDriven です。弊社リファクタリング専門チ…

アプリ設計をする際は、Active Recordから直接取得するのではなく、Domain層を作りcontrollerが返す値はDomain層から返すようにするという流れです。

一概に全てのアプリをそうするべきではないですが、ミスが起きづらいような高凝集・低結合なアプリを作るのであれば、上記のようにDomain層にcontrollerに返すデータを作成する処理を書くのが理想かと思います。

コメント

タイトルとURLをコピーしました