第3回 「つぶやき」アプリを改修してみよう(前編)
富田 陽介
Banana Systems株式会社
2009/4/27
Railsアプリケーション開発を支援する統合開発環境「3rdRail」を使って、開発、デバッグ、プロファイリングの手法をマスターしよう(編集部)
第2回「ActiveRecordが提供するModel機能」では、ファインダ、バリデーション、アソシエーション、マイグレーションについて説明しました。
Modelクラスは、Webアプリケーションの中でも、データベースとのアクセスやビジネスロジック処理を担う部分です。
今回は、第1回で作成した「つぶやき」アプリケーションを拡張/機能追加していくことで、Modelクラスの開発ステップについて学んでいきましょう。ActiveRecordが提供するModel機能を利用することで、Modelクラスで実装すべき処理が、驚くほどシンプルに記述できることを実感できると思います。
「つぶやき」を以下のように拡張してみます。
- 複数ユーザー(User)による「ひとこと」を可能にする
- ユーザーごとに「お気に入り(Favorite)」の「ひとこと」を追加できるようにする
- ほかのユーザーの「ひとこと」であっても「お気に入り」に登録できるようにする
上記の要件を満たすためのModel設計/開発ステップを見ていきます。
関連記事: | |
生産性を向上させるRuby向け統合開発環境カタログ http://www.atmarkit.co.jp/fcoding/articles/rubyide/rubyidea.html |
|
@IT Coding Edge Ruby/Rails関連記事インデックス http://www.atmarkit.co.jp/fcoding/index/ruby.html |
追加するModel候補を洗い出してみよう
要件に着目し、Model設計を検討していきます。まずは、改修/追加するModelクラスを、洗い出してみましょう。
要件の中に、いくつかの名詞が出てきました。Modelを検討する際は、これらの名詞に着目してみるのが近道です。先の要件では、以下の名詞が登場していることが確認できます。
- ひとこと(Hitokoto):これは第1回で作成済みです
- ユーザー(User)
- お気に入り(Favorite)
要件を満たすためには、上記の3つのModelクラスが必要になりそうです。
新しいModelクラスのアソシエーション(関連)を検討しよう
新たに追加するModelクラスが、どのように関連していくかを検討していきましょう。
第2回では、ActiveRecordが持つアソシエーション機能を紹介しながら、よく使用する関連の種類を紹介しました。それでは、先に挙げたModelクラスの間には、どのようなアソシエーション(関連)を定義するのが適切でしょうか。要件を1つずつ確認していきましょう。
●複数ユーザーによる「ひとこと」を可能にする
要件に登場する名詞である、「ユーザー(User)」と「ひとこと(Hitokoto)」モデルの間に作成すべき関連を考えてみましょう。モデル間の関連を考える際には、以下のように考えてみるのがポイントです。
- 「モデル名」を主語もしくは目的語とし、
- 「関連の種類(has_one、has_many、belongs_to)」を述語(動詞)に置き、
- 要件を満たすような文章を作成してみる
これを踏まえて要件の文章を見直してみると、この要件に対応する関連は以下のように考えられます。
- User has many Hitokotos(ユーザーは複数の「ひとこと」を持つ)
- Hitokoto belongs to User(「ひとこと」は、あるユーザーに属す)
つまり、「ユーザー」と「ひとこと」が「一対多」の関連となります。
●ユーザーが「ひとこと」を「お気に入り」に登録できるようにする
同様に、この要件に対応する関連を考えてみましょう。ただし、この要件は、少しトリッキーです。「一対一」でもなければ「一対多」でもなさそうだからです。
例えば、「ユーザー」から見れば、複数の異なる「ひとこと」を「お気に入り」登録できるようにする、ということになります。一方、「ひとこと」から見ても、複数の異なる「ユーザー」から「お気に入り」登録できるようにする、ということにもなります。「ユーザー」と「ひとこと」を「多対多」で関連させなければなりません。
「多対多」関連をどのように作成すれば良いでしょうか。ここで着目すべきは「多対多」関連を取り持つ「お気に入り」の存在です。確かに「ユーザー」と「ひとこと」は「多対多」で関連させる必要がありそうですが、「お気に入り」という関連を中間Modelとして考えてやれば、以下のように考えることができます。
- User has many Favorites(ユーザーは複数の「お気に入り」を持つ)
- Favorite belongs to User(「お気に入り」は、あるユーザーに属す)
- Hitokoto has many Favorites(「ひとこと」は複数の「お気に入り」を持つ)
- Favorite belongs to Hitokoto(「お気に入り」は、ある「ひとこと」に属す)
つまり、ある1件の「お気に入り」を中心に考えれば、双方への「一対多」関連と考えることができる、ということになります。
以上、各モデルのアソシエーションについて検討してきました。このような検討をしておくことで、この後のModelクラスの実装がとても楽になります。
Modelクラスの改修と追加作業の流れ
ここからは、追加要件ごとにModelクラスを改修/追加していきましょう。以降の作業の流れは以下のとおりです。
1. 新規追加するModelの初期化およびマイグレーション
2. Modelのテスト実装
3. ユニットテスト実行(失敗することを確認)
4. Modelの仕様を満たすためのコード(本番コード)を実装
5. ユニットテスト実行(成功する事を確認)
余談となりますが、小さな要件や機能実装などの適当な単位で、上記のような一連の流れ(多くの場合、上記のほかに「リファクタリング」と呼ばれるソースコードの整理作業が含まれます)を反復して進める開発を「イテレーション開発」と呼びます。また、その反復単位を「イテレーション」と呼びます。
以降、本連載では「このイテレーションでは……」という表現をすることがあります。「上記一連の流れの反復単位において……」という意味で解釈してください。
1/4 |
Index | |
「つぶやき」アプリを改修してみよう(前編) | |
Page1 追加するModel候補を洗い出してみよう 新しいModelクラスのアソシエーション(関連)を検討しよう Modelクラスの改修と追加作業の流れ |
|
Page2 複数ユーザーによる「ひとこと」を可能にする Modelのテストを実装しよう テスト用サンプル「フィクスチャ」の準備 |
|
Page3 ユニットテストコードの実装 テスト用データベースの準備 ユニットテストを実行してみよう |
|
Page4 Modelの本番コードを実装しよう ユニットテストの再実行 |
3rdRailによるRailsプログラミング入門 |
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を紹介する。※ショートカットキー、アクセスキーの解説あり
|
|