第3回 ActiveRecordを使ったソースコードを読もう
倉貫 義人
松村 章弘
TIS株式会社
SonicGarden
2009/1/28
優れたプログラマはコードを書くのと同じくらい、コードを読みこなせなくてはならない。優れたコードを読むことで、自身のスキルも上達するのだ(編集部)
- - PR -
これまでの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) 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ |
|
- PHPでGAE上に社員検索アプリを作る (2010/3/18)
GAEの制約により使うことができなかったテンプレートエンジン。PHP4GではSmartyが使えるようになった - 構造体の便利な用途、インターフェイス入門 (2010/3/10)
継承機能を排除したインターフェイス機能でダックタイピングが可能となった。サンプルで確かめてみよう - プライベートモードの履歴状態 (2010/3/1)
仕事に集中できるときと、なかなかできないとき、ありますよね。状態遷移図で考えてみよう - Goのswitch文で解くFizzBuzzと構造体のイントロ (2010/2/25)
Goではif文と同等の制御構造をswitch文で表現できる。試してみよう
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
| 「いつかは壊れるサーバ」そんな故障に 迅速で安価に手軽に対応する方法とは? New! |
| 「特権ユーザー」の事件を防げ! 万能権限を持つユーザーの管理方法とは? New! |
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | TomcatやJBossなどAPサーバ環境に関する 情報を集約! “業務”用APサーバ大百科 New! |
| ◆ | 一気に解説! 最新のクラスタストレージ 「RAIDを超えたストレージ基準」……など New! |
| ◆ | クラウド的ユーザー体験の変化は脅威か? 仮想化技術を使いこなす運用管理術を紹介 New! |

| ◆ | 上司や部下、部署内メンバーとの情報共有 を“ガラッ”と変えるコラボツールとは? New! |
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |

| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |
| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |

| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |
| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |

| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |
| ◆ | その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |







