Active Recordが凄い

f:id:ryoutaku_jo:20190109191325p:plain

【結論】
・Active Recordとは、Railsのライブラリの一種
MVCにおけるモデルの役割を担う(アプリとDBの橋渡し)
・アプリとDBには構造的ギャップがある(オブジェクトと表形式)
・それを解消させる為、Active Recordでは、
 下記の様にして、DBをオブジェクトの様に扱っている
 1:データベースのテーブル毎に、モデルクラスを定義
 2:各モデルクラスのインスタンスは、レコード1件に対応するオブジェクトになる
 3:インスタンスの属性(プロパティ)には、テーブルのカラムが追加される
・それ以外にも、データの読み書き・検索・検証などを行うメソッドを自動作成し、
 それらを用いることで、簡単にDBを操作することができる
※DB = データベース

【目次】


【本題】

きっかけ

同期のこんな発言が事の始まりでした

「『@blog.user_id』の『.user_id』って、
なんで定義されていないのに使えるの?」

※@blogはblogsテーブルのレコードを指し、user_idはカラムを指しているので、
 この場合、blogsテーブルのuser_idカラムのデータを取得できる

私は何となくでしか使って来なかったのですが、
よくよく考えると、確かに仕組みは分からなかったです。

結局その同期は自分で調べて自己解決していましたが、
どうやらActive Recordで定義されている様でした。

この時点の私のActive Recordに対する認識は、下記の通りです。
・gemの一種
・Application Recordクラスを継承させたサブクラスで、
「all」「find」「crearte」といったデータベースを
 操作するメソッドを利用できる様にする

正直、理解していると言えるレベルでは無かったので、
これを機に調べてみることにしました。

なお、下記のサイトを主に参考にしています。

ja.wikipedia.org

railsguides.jp


Active Recordとは(モデルの基礎)

Active Recordとは、
アプリ(コントローラ)とデータベースの橋渡しをする
モデルとしての役割を担うライブラリの一種です。

基本的にデータベースは、SQLを言語として用いているので、
SQLでないとデータベースを操作できません。

また、アプリ側とデータベース側では構造が異なる(オブジェクトと表形式)ので、
データベースに登録するには、オブジェクトから一つ一つ値を取り出す必要があり、
そうするとコードが膨大な量になってしまいます。

注釈
アプリとデータベースの構造的なギャップを、
インピーダンスミスマッチ」と言う

そういったアプリとデータベース間のミスマッチを
解消するツールの一つが「Active Record
」です

注釈
アプリとデータベースの構造的ギャップを
解消させるツールを総称して、「O/Rマッパー」と呼ぶ

Active Recordでは、データベースのテーブル一つを、
モデルクラスとして定義します。

このとき、モデルクラスのインスタンスは、
レコード1件に対応するオブジェクトになります。

さらに、テーブルに含まれている各行のカラムが、
作成したモデルのインスタンスの属性(プロパティ)になります。


これにより、リレーショナルデータベースを見かけ上は、
オブジェクトとして扱える様になるので、
少ないコードでデータベースを操作することが可能
になります。

また、Active RecordはRubyのコードを、SQLに翻訳してくれるので、
SQLを書かなくても、データベースの操作が可能
になっています。


では、Active Recordが行っている基本的な部分を整理します。
・データベースのテーブル毎に、モデルクラスを定義
・各モデルクラスのインスタンスは、レコード1件に対応するオブジェクトになる
インスタンスの属性(プロパティ)は、テーブルのカラムが追加される

インスタンスの属性も、Active Recordが
インスタンスメソッドで呼び出せる様に定義しています。

だから『@blog.user_id』の様に、カラム名をメソッドにして、
インスタンスにテーブル名(単数形)を指定した記述で、
blogsテーブルのuser_idカラムのデータを取得することが可能だった訳です。

Active Recordの機能

Active Recordには、それ以外にも、
データベース操作を容易にする為のメソッドがあらかじめ定義されています。

細かく説明しだすとキリが無いので、簡単に紹介します。

・データの読み書き
「Create、Read、Update、Delete」(頭文字をとって、CRUDと呼ばれる)
といったテーブルに保存されているデータを操作する。

・データの検索
「find」「where」など、データベースからオブジェクトを取得する

・データの検証
正しいデータだけがデータベースに保存される様に検証します。

マイグレーション
マイグレーションファイルの記述に則って、テーブルを作成します。
またロールバックすることで、テーブルを削除できます。

・コールバック
特定のタイミングでメソッドが呼び出される様に設定

・関連付け
モデルとモデルの間の関連付け(アソシエーション)を設定



ちなみに、Active Recordの様な、コードを書く為のコードのことを
メタプログラミングと呼ぶ様です。

Rubyでは、他の言語以上に、メタプログラミングが多用されているので、
今後学習を進める上で、重要な概念だと感じました。

以上、Active Record調べてみると、随所にオブジェクト指向に関する記載があり、
根本的な概念を理解するには、オブジェクト指向に対する理解も欠かせないので、
こちらも勉強していきます。

《今日の学習進捗》
メタプログラミングが面白くて、そちらにばかり気をとられる。
取りあえずカリキュラムが遅れ出したので、
Vim縛り解除して、進行スピードを上げていく。

学習開始からの期間 :32日
今日までの合計時間:305.0h
今日までに到達すべき目標時間:301.4h
目標との解離:+3.6h

「10,000時間」まで、

残り・・・「9695時間!」