【rails・初心者向け】ActiveRecordで使われているO/Rマッピング(ORM)とは
結論
O/Rマッピング(ORM)とは: RDB(のデータ)とアプリ(のオブジェクト)の間を取り持って適切に処理を行ってくれるもの・考え方
・・・
O/Rは、「オブジェクト/リレーショナル」の略。
RDBとは、リレーショナル・データベースのこと。MySQLとかPostgreSQLはRDB。
アプリのオブジェクトとは、例えばrailsアプリのuserクラスのインスタンスのことです。
目次
1. O/Rマッピングがrailsで使われている例
2. O/Rマッピングが行っていること オブジェクト指向とRDBの考え方の差異
3. O/Rマッピングの役割をrailsで果たしているActiveRecord
1. railsでO/Rマッピングが使われている例
例えば、restaurantクラスで考えてみましょう。
class Restaurant < ApplicationRecord
(略)
end
このクラスには以下の属性があるとします。
name | genre | place |
---|---|---|
フォームから次のような情報が入力されました。
name | genre | place |
---|---|---|
アック1号店 | ハンバーガー | 銀座 |
フォームの送信ボタンが押されて次のcreateアクションが作動し、save!
が実行されるとrailsがSQL文を発行します。
@restaurant = Restaurant.new(restaurant_params) # 上のフォームの値が入っている
if @restaurant.valid?
@restaurant.save!
end
Restaurant Create (9.7ms) INSERT INTO `restaurants` (`name`, `genre`, `place`, `created_at`, `updated_at`)
VALUES ('アック1号店', 'ハンバーガー', '銀座', '2023-06-24 05:01:17.532272', '2023-06-24 05:01:17.532272')
railsでのrestaurantオブジェクトのsave!
を受けて、RDBでもその内容のレコードが作成されました。これがO/Rマッピングの考え方が実用化された一例です。
2. O/Rマッピングの意義 オブジェクト指向とRDBの考え方の違い
railsで上のようなことが行われているのがわかりました。このような動きになるのは、O/Mマッピングのおかげです。では、なぜそういった事が必要になってくるのでしょうか?
それは、OとR、オブジェクト指向プログラミングとリレーショナルDBの間にさまざまな違いがあるためです。
こちらの記事の中盤に詳細が記載されています。
サルでもわかる Core Data 入門【概念編】
抜粋して紹介すると、両者の違いには以下のものがあります。
オブジェクト指向PG | リレーショナルDB | |
---|---|---|
技術的背景の違い | プログラム言語から派生 | データの永続化の技術から派生 |
用語の違い | クラス、オブジェクト | テーブル、レコード |
継承できるか | クラスを継承して子クラスを作れる | テーブルの定義の継承はできない |
関連の扱い | クラス属性 | 外部キー |
データ検索に関する違い | SQLのような便利な手段がない | 効率よくデータを検索できる(SQL) |
O/Mマッピングは、両者にこういった違いがある中で、両者のデータを適切に扱ってくれます。これが、O/Mマッピングが必要とされる理由です。
3. O/Rマッピングの役割をrailsで果たしているActiveRecord
「ActiveRecordパターン」というものがあります。これは、O/Rマッピングの概念を取り入れた設計ノウハウのひとつです。(注意;ややこしいですが、railsのActiveRecordとは別です!)
Active Record(アクティブ・レコード)とは、プログラミングにおいて、企業アプリケーションで頻繁に認められるパターンである。(wikipedia - Active Record)
This pattern is commonly used by object persistence tools and in object–relational mapping (ORM).([訳]このパターンは、オブジェクト永続化ツールやオブジェクト・リレーショナル・マッピング(ORM)でよく使われる。)(wikipedia - Active Record(英語版))
railsのActive Recordと「ActiveRecordパターン」の関係が説明されていたので紹介します。
(Railsの)Active RecordライブラリはSQLを意識せずにデータベースアクセスを行える非常に便利なライブラリで、その名前は「Active Recordパターン」というデザインパターンに由来しています。
Active RecordパターンをRubyで実装したライブラリが、Railsで使われているActive Recordライブラリなのです。(デザインパターンから見たActive Record)
さて、ここで始めに見たrestaurant.rb
のコードをもう一度見てみましょう。
class Restaurant < ApplicationRecord
(略)
end
class Restaurant < ApplicationRecord
の部分から、次のことがわかります。
- Restaurantクラスは、ApplicationRecordクラスを継承している
では次にApplicationRecordクラスのファイルを見てみます。
class ApplicationRecord < ActiveRecord::Base
(略)
end
ActiveRecord::Base
を継承しているのがわかりますね。
上でsqlが発行される例を見ましたが、あのような挙動が起こるのはRestaurantクラスがActiveRecord::Base
を継承しているから、ということが言えそうです。
4. まとめ
- O/Rマッピング(ORM)とは、RDB(のデータ)とアプリ(のオブジェクト)の間を取り持って適切に処理を行ってくれるもの・考え方
- railsでは、O/Rマッピングが行われている
- railsでO/Rマッピングの役目を果たしているのは、MVCのMの部分の「ActiveRecord」である
あとがき
最近知ったこの分野。
railsを学びたてのときに教えてほしかった…!と思いました。
rails初学者の方のためになれば幸いです!
転職を考えている方へ
「転職ドラフト」というサービスを使って、企業から指名を受けてみませんか?
実務1-2年目でも、うまくいけば転職ドラフトで年収数百万UPできるようです(ググると記事が見つかるはず)
登録時に次の紹介コードを入れて、その後レジュメ審査が通過すると、もれなくAmazonギフト券3000円分などのプレゼントがもらえます。
気になっている方はぜひ使ってみてください!
紹介コード:HJGJ
転職ドラフト
参考資料
オブジェクト関係マッピング - Qiita
デザインパターンから見たActive Record
Active Record の基礎 - railsガイド
サルでもわかる Core Data 入門【概念編】
O/Mマッピング
Discussion