第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) 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|