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

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

富田 陽介
Banana Systems株式会社

2009/4/27

複数ユーザーによる「ひとこと」を可能にする

 それでは、1つめの要件に取りかかります。

 この要件を満たすために、先ほど検討した関連を再度確認しておきましょう。

  • User has many Hitokotos(ユーザーは複数の「ひとこと」を持つ)
  • Hitokoto belongs to User(「ひとこと」は、あるユーザーに属す)

 この要件を実装するための手順を整理してみます。

  1. 新規追加するModelの初期化およびマイグレーション
     ・Userモデルの追加
     ・HitokotoモデルにUserモデルへの関連を示すIDを追加
  2. Modelのテスト実装
     ・フィクスチャの準備
     ・以下のテストコードを実装
      ・Userインスタンスから関連するHitokotoインスタンスを取得
      ・Hitokotoインスタンスから関連するUserインスタンスを取得
     ・テスト用DBの準備
  3. ユニットテスト実行(失敗することを確認)
  4. 本番コード実装
     ・2で作成したテストコードが正常に実行できるように実装
  5. ユニットテスト実行(成功する事を確認)

 それぞれの手順について確認していきましょう。

●Userモデルの追加

 Userモデルを追加するにあたって、ユーザーに必要な属性を検討しておきましょう。ひとまず、ユーザーの名前に相当する属性があれば十分ですので、ここではユーザー名としてnameという属性を使用することにします。

 それでは、3rdRailを使い、第1回でHitokotoモデルを作成したときと同様、モデルクラスを作成していきましょう。[Railsエクスプローラー]でtsubuyakiプロジェクト以下の[モデル]を右クリックし、[リソースの新規作成]をクリックします。

 モデル名にはuser、属性にはnameをstring型で指定します。name属性の[必須]列にはチェックを入れておきましょう。また、今回は[生成されたリソースのスカフォルドを作成する]チェックを外しておくこととします。

リソース新規作成ウィザード
リソース新規作成ウィザード

 上記がすべて入力できたら、[完了]ボタンを押します。Userクラスのスクリプトファイルuser.rbやusersテーブル定義を行うマイグレーションファイルが自動生成され、データベースのテーブル定義が更新されます。ウィンドウ下の[コンソール]に表示される実行ログも確認しておきましょう。

●Hitokotoモデルへの属性追加

 続いて、HitokotoモデルがUserに属すことができるようにHitokotoモデルを改修しましょう。Hitokotoモデルから見て、どのUserに属しているかが分かればよいので、Userへの関連IDが必要になります。そこで、マイグレーション機能を使用して、Hitokotoモデルの属性としてUserモデルへの関連IDを追加します。

 さて、すでに紹介したとおり、Ruby on Railsではテーブル間のアソシエーションを利用する際の関連IDについて、命名規約が定められています。この命名規約に則ってテーブル中のカラム名を付与すれば、ActiveRecordの機能によりモデル間の関連がシンプルに解決されるようになっています。

 関連IDは、

関連モデル名(単数形)_id

でなければなりません。ここでは、データベースのhitokotosテーブルにuser_idという名前のカラムを追加していきます。

 [Railsエクスプローラー]のtsubuyakiプロジェクト以下、[データベース]−[マイグレーション]を右クリックし、[マイグレーションの新規作成]をクリックします。以下のダイアログが表示されます。

マイグレーション新規作成ウィザード
マイグレーション新規作成ウィザード

 このウィザードでは、マイグレーション名(マイグレーションファイルおよびマイグレーションを行うクラス名に割り当てられます)を指定することで、マイグレーションファイルの自動生成が行われます。

 マイグレーション名は任意に決定できますが、後からマイグレーションファイル名を一覧した際に分かりやすい名前を付けておいた方がよいでしょう。今回は、上図のとおり、「add_user_id_to_hitokotos」というマイグレーション名を指定します。

 [完了]ボタンをクリックすると、マイグレーションファイルが作成され、編集エリアにマイグレーションファイルが表示されます。

作成されたマイグレーションファイル
作成されたマイグレーションファイル

 マイグレーションファイルにhitokotosテーブルへのuser_idカラムの追加定義を書いていきましょう。今回は、カラム名を追加するメソッドadd_columnを用いて以下のようにマイグレーションファイルを編集します。必要に応じて^+Spaceのコード補完を試したり、[Rubyドキュメンテーション]タブに表示されるリファレンスなどを参照したりしてください。

マイグレーションスクリプトに追加定義を行う
class AddUserIdToHitokotos < ActiveRecord::Migration
  def self.up
    add_column :hitokotos, :user_id, :integer, :null => false, :default => 0
  end

  def self.down
    remove_column :hitokotos, :user_id
  end
end

 上記のコードについて詳細な説明を割愛しますが、ここではhitokotosテーブルにuser_idという名前のカラムをinteger型で追加しています。またNOT NULL制約を付与し、デフォルト値を0として規定しています。

 マイグレーションファイルの編集が完了したら、いよいよマイグレーションを実行します。[Railsエクスプローラー]のtsubuyakiプロジェクト以下、[データベース]−[マイグレーション]−[(上記で編集した)年月日時分秒 - Add user id to hitokotos]を右クリックし、[Rails]−[データベースマイグレーション 年月日時分秒 - Add user id to hitokotos の実行]をクリックします。マイグレーションが実行され、データベース定義が更新されます。コンソールに表示されるログも確認しておきましょう。

 以上で、このイテレーションでのマイグレーションは完了です。

Modelのテストを実装しよう

 続いて、今回作成するModelが正しく動作することを確認するための、テストの実装に入っていきます。UserとHitokotoの間には、すでに検討したとおり、以下の関連を実装していくことになります。

  • User has many Hitokotos(ユーザーは複数の「ひとこと」を持つ)
  • Hitokoto belongs to User(「ひとこと」は、あるユーザに属す)

 ここでは、上記の関連が正しく実装できている状態を確認するためのユニットテストを実装していきましょう。

テスト用サンプル「フィクスチャ」の準備

 ユニットテスト実装の始めとして、テスト用のサンプルデータを作成します。このサンプルデータのことをフィクスチャ(fixture)と呼びます。

 テスト実行時のテストデータベースの初期化やサンプルレコードの作成支援の手段として、Ruby on Railsはフィクスチャからのデータ取り込み機能を提供しています。フィクスチャを作成しておくことで、複数のユニットテストをまとめて実行する際であっても、都度データベースへのサンプルレコード作成処理が実行されるので、大変便利です。

 それではフィクスチャの作成に入りましょう。[Railsエクスプローラー]ビューから[テスト]−[フィクスチャー]を選択し、hitokotosをダブルクリックすると、編集エリアにhitokotosテーブル用のサンプルデータを作成するためのファイルhitokotos.ymlが表示されます。

 hitokotos.ymlを、以下のとおりに編集してください。

hitokotos.yml
banana:
  id: 1
  user_id: 1
  hitokoto: バナナ
milk:
  id: 2
  user_id: 1
  hitokoto: 牛乳

 フィクスチャファイルは、その拡張子が示すとおり、YAML形式のファイルとなっています。YAMLは、上記のように、インデントにより階層構造を表現するもので、フィクスチャファイルにおいては「レコード名(ユニットテストから個別のレコードを指定する際に使用できます)」>「そのレコードの各カラムの値」という構造で、サンプルレコードを記述できます。

 ここでは、user_id=1のユーザーにひも付くHitokotoレコードを2件、サンプルレコードとして設定しました。

 続いて、ユーザーのフィクスチャファイルusers.ymlも同様に記述していきましょう。users.ymlは以下のように編集してください。ここでは、id=1のユーザーとして「富田」を設定しました。

users.yml
tomita:
  id: 1
  name: 富田

 以上で、このイテレーションで使用するフィクスチャの作成は完了です。

prev
2/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 記事ランキング

本日 月間