ActiveRecordの本当に素晴らしい理由

ActiveRecordがDBを抽象化してどんなDBでも扱えるようにする理由を説明します。抽象化の強力さと価値を知ります。

• bamchi • 5,499
目次

ActiveRecordは本当に素晴らしい理由 - DBを'抽象化'するため、どのDBでも扱える

プログラミングで最も難しい問題は
異なるシステムを一貫した方法で扱うことだ。

データベースは特にそうだ。

  • MySQLはこのような文法

  • PostgreSQLはああいう文法

  • SQLiteはまた異なり

  • Oracleは完全に別世界

これらをすべて直接扱うには
開発者はDBの文法、SQLの方言、インデックス特性、タイプシステム、トランザクション処理方法まで
毎回すべて覚えていなければならない。

しかしRailsはこれらすべての問題を
ActiveRecordというたった1つのレイヤーで解決した。

これがまさに抽象化だ。


抽象化とは何か?(比喩なしで概念そのもので)

抽象化の核心は単純だ。

複雑なシステムをただ1つの共通インターフェース(API)に統一すること。

つまり、
動作方法は多様であっても
使用方法は1つにすること。

抽象化はエンジニアリングの世界で
最も強力な技術の1つだ。


ActiveRecordは何を抽象化したか?

正解は1つだ。

DBごとに異なるSQL文法と動作をRubyオブジェクト操作に統一した。

つまり、

「DBごとに異なる世界」を
「Rubyコードという1つの世界」に変えてしまったのだ。


これがどれほど強力か?例で証明しよう

例えば、Userリストを取得したいとしよう。

直接SQLを使う場合:

MySQL

SELECT * FROM `users` ORDER BY `created_at` DESC LIMIT 10;

PostgreSQL

SELECT * FROM users ORDER BY created_at DESC LIMIT 10;

Oracle

SELECT * FROM users WHERE ROWNUM <= 10 ORDER BY created_at DESC;

文法が全く異なる。
LIMITも異なり、クエリのルールも異なり、予約語も異なる。

しかしActiveRecordを使えば?

Rails

User.order(created_at: :desc).limit(10)

終わり。

ActiveRecordはこのRubyコード1つを基に
各DBに合ったSQLに自動変換する。

  • MySQLならMySQL専用SQL

  • PostgreSQLならPostgreSQL専用SQL

  • SQLiteならSQLite専用SQL

つまり、開発者はRubyだけ知ればいい。


抽象化が提供する実際の価値

ActiveRecordが抽象化を通じて得る利点は次のとおり。


1) DBの交換が自由だ

例えばSQLite → PostgreSQLに変えるとしよう。

普通なら:

  • すべてのSQLを修正

  • すべてのタイプを変更

  • すべてのトランザクション処理を修正

  • すべてのLIMIT/OFFSET文法を修正

しかしRailsでは…
何も変える必要がない。

Railsのconfigでadapterだけ変えればいい。

adapter: postgresql

コードはそのまま:

User.where(active: true)

これで正常に動く。


2) DBについての知識を持たなくても開発できる

ActiveRecordは次を自動処理する:

  • データ保存

  • 更新

  • 取得

  • 削除

  • トランザクション

  • 関係設定

  • 外部キー処理

  • JOIN最適化

開発者はこれだけでいい。

user = User.find(5)
user.update(name: "New Name")

しかし実際のDBでは内部的に
複雑なSQLが自動実行される:

UPDATE users SET name = 'New Name' WHERE id = 5;

開発者はこれを知らなくていい。


3) モデル中心思考(Model-driven Thinking)を可能にする

SQLはデータ中心思考だ。
しかしRailsはオブジェクト中心思考だ。

つまり、私たちはUserモデルを本物のオブジェクトのように扱う。

user.posts

この1行は
JOIN、WHERE、INDEX、関係解釈…
すべてを処理する。

ActiveRecordがあるおかげで
開発者はビジネスロジック設計に集中できる。


抽象化を理解する瞬間、ActiveRecordがどれほど天才的かがわかる

以下のRubyコードを見てみよう。

users = User.where("age > ?", 18).order(:created_at)

このコードが実行されると内部で:

  1. モデルの構造を見て

  2. DBの種類を確認して

  3. WHERE条件を安全にエスケープして

  4. ソート方法を適用して

  5. 該当DBが理解するSQL文法に変換して

  6. SQLを実行して

  7. 返された値をレコードではなくRubyオブジェクト(User)に変換する

このすべてのプロセスは開発者が意識する必要がない。

つまり、

ActiveRecord = DBという異なる世界をRubyの世界に完全に同化するツール

この抽象化のおかげで
Rails開発者は
DB専門家でなくても
わずか数行のRubyだけで
サービス全体のデータを扱うことができる。


結論 - ActiveRecordはORMではなく 'DB抽象化エンジン'

なぜActiveRecordが"本当に素晴らしい奴"なのか?

その理由は1つだ。

ActiveRecordは開発者に DBごとに異なる複雑さと規則をすべて忘れさせる。
そしてRubyという単一の言語であらゆる種類のDBを同じ方法で扱えるようにする。

これが抽象化の力だ。
これがRailsの哲学だ。
これがなぜActiveRecordが歴代最高のORMなのかの答えだ。

コメント

コメントする

メールアドレスは公開されず、返信通知にのみ使用されます。

続けて読む

新しい記事の通知を受け取る

Bamchi Blogに新しい記事が公開されたらメールでお知らせします。

メールアドレスは新着記事のお知らせにのみ使用します。