第3回 ActiveRecordを使ったソースコードを読もう

倉貫 義人
松村 章弘
TIS株式会社
SonicGarden

2009/1/28

優れたプログラマはコードを書くのと同じくらい、コードを読みこなせなくてはならない。優れたコードを読むことで、自身のスキルも上達するのだ(編集部)

 これまでの2回の記事で、Railsアプリケーションの基本的な構成と、テスティングフレームワークであるRSpecを使ったソースコードのコードリーディングを行ってきました。今回は、RailsのキモでもあるDBアクセス処理の部分を扱うActiveRecordを深く掘り下げてコードリーディングを行います。

 ActiveRecordとは、まさしく同名の“Active Record”というDBアクセスに関するデザインパターンを実装したライブラリです。データベースのテーブルをクラスとしてビジネスロジックを持たせ、テーブルの1行1行をインスタンスとして扱う考え方のデザインパターンです。このように、オブジェクトとリレーショナルデータベースをつなぐものをO/Rマッパーと呼んでいます。

 Railsでは、O/RマッパーとしてActiveRecordを採用しています。テーブルのカラムが、Rubyオブジェクトのメソッドに対応するなど、データベースへの処理をRubyのオブジェクトで扱えるように抽象化されています。これによって、SQLを直接書くことが、ほとんどなくなります。

 まずは、あらためて本連載のコードリーディングの題材として扱うオープンソースの紹介をしましょう。

SKIPバージョン1.0リリース!

 前回の第2回から今回までの間に、本連載の題材であるオープンソース「SKIP」のバージョン1.0がリリースされました。そこで、今回から扱うソースコードは、バージョン1.0を対象としていきます。

関連リンク:
リンク オープンソース「SKIP」
http://www.openskip.org/

 SKIPのバージョン1.0で追加された機能について簡単に紹介しておきます。

  • 管理機能が付きました。Webの画面上からSKIPに登録されているデータを管理できるようになりました。
  • OpenIDに対応しました。認証処理を外部のOpenIDプロバイダを使ってログインする機能が付きました。
  • ランキング機能が付きました。ブログの記事数や、人気記事などのSKIP上のトレンドを知ることができます。

 バージョン1.0では、それまでのバージョンと違い、プログラマ以外の一般の方々にとっても、SKIPを使いやすいものにすることを主眼に置いて開発されました。LDAPを使う場合の多い企業ユースでは、LDAPにOpenIDインターフェイスを追加することで、社内の認証方式でSKIPにログインできるようになったので、より企業内での利用が促進されることを期待しています。

 そのほかにも多くの改善が行われています。以下のURLよりリリースノートをご覧ください。

関連リンク:
リンク SKIP ver1.0のリリースノート
http://portal.openskip.org/top/releasenote-ver1-0-0

 今回扱うソースコードの場所ですが、こちらも前回から大きく変更されました。SKIPの開発コミュニティでは、いままではSubversionを自前で運用してソースコード管理を行ってきたのですが、バージョン1.0公開のタイミングでGitHubというインターネットのサービスへ移行しました。以下に、GitHub上のSKIPの公開URLを示します。

 GitHubは、gitという分散リポジトリ管理ツールのホスティングサービスです。gitはLinuxの開発でも使われているリポジトリ管理のツールです。gitの詳しい紹介は@ITの解説記事を参照ください。

 GitHubからの直接のソースコード取得には、gitコマンドを使います。それができない場合は、SKIPの公式サイトから圧縮ファイルの形でダウンロードすることもできます。

関連リンク:
リンク SKIP ver.1.0.1のソースコード
http://github.com/openskip/skip/tree/v1.0.1
リンク 分散バージョン管理Git/Mercurial/Bazaar徹底比較
http://www.atmarkit.co.jp/fjava/rensai4/devtool03/devtool03_1.html
リンク SKIP ver.1.0.1のダウンロード
http://www.openskip.org/ja/download

MVCモデルのM

 今回のコードリーディングでは、SKIP上では利用者情報を示す「ユーザー」の機能を中心に読んでいきます。

 ActiveRecordのソースコードは、Railsアプリケーション上では、モデルとして実装されています。Railsアプリケーションは、MVCで構成されており、モデル(M)とビュー(V)とコントローラ(C)という形で、役割分担が明確になっています。

 モデルの部分では、ビジネスロジックの処理とデータの保存を行うのですが、そのデータの保存先として、リレーショナルデータベースを使います。そこで、O/RマッパーであるActiveRecordの出番になるわけです。

 つまり、ActiveRecordのソースコードを読むということは、Railsアプリケーションのモデル部分のソースコードを読むということです。今回、中心に見ていくのがユーザー機能なので、対応するテーブルは「Users」テーブル、そしてソースコードは「Userモデル」になります。その「Userモデル」のソースコードの先頭部分を見てみましょう。

16
class User < ActiveRecord::Base
app/models/user.rb

 16行目(実質の1行目)は、クラスの宣言部分です。ここで、ActiveRecord::Baseというクラスを継承していることが分かります。ActiveRecord::Baseは、Railsフレームワークで用意されているActiveRecordの基本的な振る舞いを実装したクラスです。それぞれのRailsアプリケーションで継承して使われることを前提に作られています。

 実は、このようにしてActiveRecord::Baseを継承するだけで、中身のソースコードを1行も書かずとも、「Users」テーブルにアクセスしてデータのやりとりを行うことのできるクラスを作ることができます。

 このあたりが、Railsの真骨頂でもあり、黒魔術とも呼ばれる部分になりますが、クラスの名前付けの規約に従って、DBアクセスのソースコードをRails側で用意してくれるのです。その規約は「モデル名」の英語表記での複数形が「テーブル名」になるようにするというものです(例:UserモデルとUsersテーブル)。

 
1/4

Index
ActiveRecordを使ったソースコードを読もう
Page1
SKIPバージョン1.0リリース!
MVCモデルのM
  Page2
データの検索
データの更新
  Page3
値の検証(バリデーション)
コールバック
  Page4
テーブルの関連
トランザクション

Railsコードリーディング 〜scaffoldのその先へ〜

 Ruby/Rails関連記事
プログラミングは人生だ
まつもと ゆきひろのコーディング天国
 ときにプログラミングはスポーツであり、ときにプログラミングは創造である。楽しいプログラミングは人生をより実りあるものにしてくれる
生産性を向上させるRuby向け統合開発環境カタログ
Ruby on Rails 2.0も強力サポート
 生産性が高いと評判のプログラミング言語「Ruby」。統合開発環境を整えることで、さらに効率的なプログラミングが可能になる
かんたんAjax開発をするためのRailsの基礎知識
Ruby on RailsのRJSでかんたんAjax開発(前編)
 実はAjaxアプリケーション開発はあなたが思うよりも簡単です。まずはRuby on Railsの基礎知識から学びましょう
Praggerとnetpbmで作る画像→AA変換ツール
Rubyを使って何か面白いものを作ってみよう!
 一般的な画像をアスキーアートに変換するツールを作ってみる。さらに出力にバリエーションを持たせてみよう
コードリーディングを始めよう
Railsコードリーディング〜scaffoldのその先へ〜(1)
 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間