CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
今回は、Ruby on Railsでの神秘的なお話をしたいと思います。
RailsはWebアプリケーションを作成するための土台となるフレームワークです。フルスタック(全部盛り)フレームワークでアプリケーションを作成する機能が潤沢に用意されています。最小限のRailsであるRailtieをコア(核)にして機能毎に多数のコンポーネントが糊付けされることで構成されているのです。
その重要コンポーネントの一つにActiveRecordという機能が提供されています。Webアプリケーションでは往々にしてリレーショナルデータベース(RDBMS)を利用しますが、これらを抽象化してプログラムからデータベースを容易に操作する機能層が存在します。一般にO/Rマッピング(Object-Relational Mapping)と呼ばれる(ソフトウェア)層です。RailsでこのO/Rマッピング機能に相当するのが、ActiveRecordとなります。
ActiveRecordではモデルという抽象化層を挟むことでデータベース操作の機能を実装しています。使ってみるとすぐさま便利さを体感できることでしょう。顕著な例としてRailsではモデル(Rubyプログラム)とテーブル(データベース)が命名規約によって対応付けられますが、モデルを操作することで透過的にデータベースにアクセスすることが出来るのです。該当テーブルのカラム名がモデルの(アクセス)メソッドとして使えるのです。
このActiveRecordの便利な機能を利用するには、データベースの作成を含めた幾つかのファイルや操作が必要となりますが、これまたRailsのジェネレータという機能で必要なファイルを自動生成してくれます(とても便利です)。後は必要な箇所を追加、修正すれば良いのです。
例えばUserモデルは命名規約でusersテーブルにより関係付けされます。テーブルの中にUserに関する一件のデータが一行(1ロウ)として格納されます。複数のUserデータが入るテーブルのため、テーブル名はusers(複数形)とするのです。モデルはRubyのクラス(class)でUserモデルのデータとしての属性である名前や生年月日などの指定した情報をusersテーブルのカラム(列)に格納されるようになっています。ユーザの名前(name)の情報が欲しい時には、インスタンスからカラム名をメソッドとして呼び出すだけです。
| dhh = User.first # データベースから最初のユーザを取得する。 | dhh.name # 取得したユーザの名前を知りたい。
どうですか?すごく簡単でしょう?
しかしそこでふと素朴な疑問が湧き上がります。よく調べると、このモデルのコードは空なのです。
| class User < ActiveRecord::Base | end
ジェネレータが生成したモデルのクラスにはメソッドが書かれていません。何処にも定義されていないのです。それにも拘らずnameメソッドを呼び出せました。とても不思議です。継承したスーパークラスでメソッドがどこかにあるのだろうと憶測しようにも自分が作ったカラムと同じ名前のメソッドをどうしてActiveRecordは知るのでしょう?
そして、どうやって用意しているのでしょう?
これは、ActiveRecordによって対応するテーブルのカラム(列)が動的に確認されることによって行われるようです。Railsのバイブルである書籍「RailsによるアジャイルWebアプリケーション開発 第4版」での記載も同様の記述でした。これで納得も出来るのですが、まだ少しもやもやします。
メソッドの動的生成機能に関して考える時にRubyではなくJavaだったらと思いを馳せてみました。Java言語でイントロスペクション的な機能を実装することも可能でしょう。リフレクションを利用して該当インスタンスの属性(プロパティ)関連情報を取得してメソッドを用意するような実装が考えられます。但し、この場合ですら関連するコードのどこかにメソッドの定義がある筈です。Java言語ベースのフレームワークでこの様な事象は見たことが無いですし、有り得ないのではとも空想しました。
この疑問に囚われてしまったこと、それ自体が敗因かもしれません。残された道は、ソースコードを丹念に読むことしかないのでしょう。(聞き込みならぬ読み込みを重ね、被疑者を追い続けた末に、ある程度容疑者を絞り込みました。機会と要望があればいつかご紹介します。)
回り道となりましたが、ActiveRecordの特筆すべき利便性を享受出来ることが御理解いただけたことでしょう。但し、ActiveRecordがあるからデータベース、SQLの知識が不要と思ってはいけません。むしろ、どんなSQLが発行されているのか考える場合もあるからです。事前にデータベースの基礎知識は必要だと考えるのが妥当でしょう。無論、Rubyの基礎知識も必須です。
今回ご紹介したことは筆者がRailsを勉強して最初に悩んだ疑問です。まるで黒魔術のようにという表現がピッタリです。実際に書籍などでは、RubyとRailsが魔術を利用しているようだとよく書かれています。これはRuby言語が持つ性質をRailsで大いに活用し実装していることに尽きます。黒魔術ではなく、巧妙な仕掛けによるトリックなのです。このトリックによって、様々な便利さをRailsは提供しています。
本来、これらの実装を気にするよりも充分に便利さの恩恵を授かれば良いのだと考えます。今回は筆者の性分で少し気になったのです。これに懲りず、また気になる難題に魅せられるかもしれません。それとRailsの源流であるRuby言語の黒魔術、否、トリックをご紹介できればとも思います。どんと来い、超常現象であります。
では、次回もお楽しみに。
>> Rubyの関連コース一覧
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes