🐥

【rails・初心者向け】ActiveRecordで使われているO/Rマッピング(ORM)とは

2023/06/25に公開

結論

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クラスで考えてみましょう。

app/models/restaurant.rb
class Restaurant < ApplicationRecord
()
end

このクラスには以下の属性があるとします。

name genre place

フォームから次のような情報が入力されました。

name genre place
アック1号店 ハンバーガー 銀座

フォームの送信ボタンが押されて次のcreateアクションが作動し、save!が実行されるとrailsがSQL文を発行します。

restaurants_controller#create
@restaurant = Restaurant.new(restaurant_params) # 上のフォームの値が入っている
if @restaurant.valid?
  @restaurant.save!
end
SQL文
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のコードをもう一度見てみましょう。

app/models/restaurant.rb
class Restaurant < ApplicationRecord
()
end

class Restaurant < ApplicationRecordの部分から、次のことがわかります。

  • Restaurantクラスは、ApplicationRecordクラスを継承している

では次にApplicationRecordクラスのファイルを見てみます。

app/models/application_record.rb
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

転職ドラフト

https://job-draft.jp/


参考資料

オブジェクト関係マッピング - Qiita
https://qiita.com/yk-nakamura/items/acd071f16cda844579b9

デザインパターンから見たActive Record
https://www.techscore.com/tech/Ruby/Rails/other/designpattern/

Active Record の基礎 - railsガイド
https://railsguides.jp/active_record_basics.html

サルでもわかる Core Data 入門【概念編】
https://glassonion.hatenablog.com/entry/20111015/1318667971

O/Mマッピング
https://ja.wikipedia.org/wiki/オブジェクト関係マッピング

Discussion