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クラスについて、本番コードを実装していきます。それぞれの編集後のソースコードは以下のとおりです。
class Favorite < ActiveRecord::Base validates_presence_of :user_id validates_presence_of :hitokoto_id belongs_to :user belongs_to :hitokoto end
class User < ActiveRecord::Base validates_presence_of :name has_many :hitokotos has_many :favorites has_many :favorite_hitokotos, :through => :favorites, :source => :hitokoto end
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クラスの開発ステップについて紹介していく予定です。
![]() |
2/2 |
Index | |
「つぶやき」アプリを改修してみよう(後編) | |
Page1 Favoriteモデルを追加しよう Favoriteクラスのテストを実装しよう ユニットテストコードを実装しよう テスト用データベースをマイグレーションしよう |
|
![]() |
Page2 ユニットテスト実行を実行しよう Modelの本番コードを実装しよう 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を紹介する。※ショートカットキー、アクセスキーの解説あり
![]() |
||
|
||
![]() |
Coding Edge 記事ランキング
- 「Dify」とは? メリットや使い方を簡単に解説
- 「VS Code」と「Copilot」でローカルAIモデルを活用 Microsoftがガイドを解説
- さくらインターネット、API一つでLLMの推論やRAGを実行する「さくらのAI Engine」提供開始
- 「Rustの長いコンパイル時間が生産性を低下させている」 Rustプロジェクトが公式調査結果を公開
- AIのPoCを成功させる9つのルール Dockerが紹介
- 「Visual Studio Code」と「Ollama」で簡単に始められる、安心・安全なローカルAI活用術
- PDFファイルをRAG用ベクトルストアにETL処理する方法をSpring AIで理解する
- GitHub、「GitHub MCP Registry」提供開始 「MCPサーバレジストリ」の役割とは何か
- 「一般社団法人Dify協会」設立
- 生成AI活用の落とし穴「精度」を上げる方法、プロンプト設計の失敗例とその対処法をDifyで学ぶ
- 「VS Code」と「Copilot」でローカルAIモデルを活用 Microsoftがガイドを解説
- Python独走の影で「Perl」がちょっとずつランクを上げる理由 2025年9月版プログラミング言語人気ランキング
- 「MCPはAPIではない」――Dockerが解説するAIエージェント開発のベストプラクティスとは
- Microsoft、「Visual Studio 2026 Insiders」を公開 「AI統合」「パフォーマンス改善」が特徴
- ローコードで「倉庫管理システム」を4カ月で内製リプレース 調味料メーカーのダイショーが語る、非エンジニア中心で成功に導けた理由、実践のポイント
- コード補完以外の「GitHub Copilot」活用法
- GitHub Copilotの能力を引き出すカスタム指示とは GitHubがポイントを解説
- 「Rustの長いコンパイル時間が生産性を低下させている」 Rustプロジェクトが公式調査結果を公開
- 「Gemini」にURLで情報を直結 「URLコンテキストツール」をGoogleが公開
- Visual Studioが「MCP」に正式対応 AIによる開発がさらに容易に