3rdRailによるRailsプログラミング入門

第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)」モデルの間に作成すべき関連を考えてみましょう。モデル間の関連を考える際には、以下のように考えてみるのがポイントです。

  1. 「モデル名」を主語もしくは目的語とし、
  2. 「関連の種類(has_one、has_many、belongs_to)」を述語(動詞)に置き、
  3. 要件を満たすような文章を作成してみる

 これを踏まえて要件の文章を見直してみると、この要件に対応する関連は以下のように考えられます。

  • 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クラスを改修/追加していきましょう。以降の作業の流れは以下のとおりです。

0. 改修/追加するModelの属性と仕様の検討
1. 新規追加するModelの初期化およびマイグレーション
2. Modelのテスト実装
3. ユニットテスト実行(失敗することを確認)
4. Modelの仕様を満たすためのコード(本番コード)を実装
5. ユニットテスト実行(成功する事を確認)

 余談となりますが、小さな要件や機能実装などの適当な単位で、上記のような一連の流れ(多くの場合、上記のほかに「リファクタリング」と呼ばれるソースコードの整理作業が含まれます)を反復して進める開発を「イテレーション開発」と呼びます。また、その反復単位を「イテレーション」と呼びます。

 以降、本連載では「このイテレーションでは……」という表現をすることがあります。「上記一連の流れの反復単位において……」という意味で解釈してください。

 
1/4
next

Index
「つぶやき」アプリを改修してみよう(前編)
Page1
追加するModel候補を洗い出してみよう
新しいModelクラスのアソシエーション(関連)を検討しよう
Modelクラスの改修と追加作業の流れ
  Page2
複数ユーザーによる「ひとこと」を可能にする
Modelのテストを実装しよう
テスト用サンプル「フィクスチャ」の準備
  Page3
ユニットテストコードの実装
テスト用データベースの準備
ユニットテストを実行してみよう
  Page4
Modelの本番コードを実装しよう
ユニットテストの再実行

index 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)
 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ
  Coding Edgeフォーラムフィード  2.01.00.91


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

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間