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

第4回 「つぶやき」アプリを改修してみよう(後編)

富田 陽介
Banana Systems株式会社

2009/4/28

Favoriteモデルを追加しよう

 それでは、ユニットテストを実行しましょう。

 [Railsエクスプローラー]ビューから[ユニットテスト]を右クリックし、[実行]−[Rubyテスト]をクリックします。以下のようにテストが失敗することが確認できます。

 進捗バーが赤で表示され、無事に(?)テストに失敗することが確認できました。ここでのテスト失敗理由も、前回同様、関連インスタンスを取得するためのメソッドが定義されていないことによるものです。

スクリプト・テスト(画像をクリックすると拡大します)
スクリプト・テスト

 障害トレースのログに、以下のようなメッセージが表示されていることも確認しておきましょう。

undefined method `hitokoto' for #<Favorite:0x2128868>
/Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/attribute_methods.rb:260:in `method_missing'
/Users/tmtysk/Documents/3rdRail/workspace/tsubuyaki/test/unit/favorite_test.rb:11:in `test_Favoriteが属すHitokotoを取得できる'
:

Modelの本番コードを実装しよう

 ここでは、Favorite、User、HitokotoそれぞれのModelクラスについて、本番コードを実装していきます。それぞれの編集後のソースコードは以下のとおりです。

favorite.rb
class Favorite < ActiveRecord::Base

  validates_presence_of :user_id
  validates_presence_of :hitokoto_id

  belongs_to :user
  belongs_to :hitokoto

end
user.rb
class User < ActiveRecord::Base

  validates_presence_of :name

  has_many :hitokotos
  has_many :favorites
  has_many :favorite_hitokotos, :through => :favorites, :source => :hitokoto

end
hitokoto.rb
class Hitokoto < ActiveRecord::Base

  validates_presence_of :hitokoto

  belongs_to :user
  has_many :favorites
  has_many :favorited_users, :through => :favorites, :source => :user

end

 favorite.rbでは、User、Hitokotoモデルに「属す」関連としてbelongs_toを使用した行を追加します。

 ここではUser、Hitokotoそれぞれのソースコードに新しい表現が登場していることを確認しましょう。Userモデルクラスに記述されている、以下の行に注目してください。

 has_many :favorite_hitokotos, :through => :favorites, :source => :hitokoto

 これは、先ほど紹介した「多対多」関連を簡単に解決するための記述方法の1つで、has_many :throughと呼ばれます。この行では、その記述内容が示すとおり、

  • Userが複数のfavorite_hitokotoを持ち、
  • Favorite中間モデルを経由(through)して得られる関連先(source)のHitokotoインスタンスをfavorite_hitokotosとしてアクセスできるようにする

ことを規定しています。同様のhas_many :throughをHitokotoモデルクラスに記述することで、Hitokotoインスタンスからもfavorited_usersとして、お気に入り登録したユーザーの一覧を取得することができます。

 このように、一見複雑な、中間モデルを導入した「多対多」関連であってもシンプルに記述できるのは、ActiveRecordならではの非常に強力な機能といえるでしょう。以上で、このイテレーションの本番コードの実装は完了です。

 最後に、再度スクリプト・テストを実行し、所期のテストコードが正常に実行できることを確認しておきましょう。

スクリプト・テスト
スクリプト・テスト

 進捗バーが緑表示になったでしょうか。これで、2つめの要件を満たすためのイテレーションは完了です。

Modelクラスの開発ステップのまとめ

 第2回から今回まで、Modelクラスの開発ステップを、やや実践的に説明しました。

 第2回では、ActiveRecordが提供する強力なModelクラスの実装支援機能として、ファインダ、バリデーション、アソシエーション、マイグレーションを取り上げました。また、それぞれの機能を動作確認する際、3rdRailのRailsコンソール機能やコード補完機能についても紹介しました。

 第3回と第4回では、第1回で作成した「つぶやき」アプリケーションの機能追加を想定し、新しいModelクラスの追加、既存Modelの改修とマイグレーション、has_manyやhas_many :through関連の定義、およびユニットテストの実行といった開発イテレーションについて紹介してきました。ユニットテストの実行状況が3rdRailのテストスクリプトビューで簡単にモニタリングできることにも触れました。

 次回は、追加/改修したModelクラスを扱う画面遷移などを検討しながらControllerクラスの開発ステップについて紹介していく予定です。

prev
2/2
 

Index
「つぶやき」アプリを改修してみよう(後編)
  Page1
Favoriteモデルを追加しよう
Favoriteクラスのテストを実装しよう
ユニットテストコードを実装しよう
テスト用データベースをマイグレーションしよう
Page2
ユニットテスト実行を実行しよう
Modelの本番コードを実装しよう
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 記事ランキング

本日 月間