複数ユーザーによる「ひとこと」を可能にする
それでは、1つめの要件に取りかかります。
この要件を満たすために、先ほど検討した関連を再度確認しておきましょう。
- User has many Hitokotos(ユーザーは複数の「ひとこと」を持つ)
- Hitokoto belongs to User(「ひとこと」は、あるユーザーに属す)
この要件を実装するための手順を整理してみます。
- 新規追加するModelの初期化およびマイグレーション
・Userモデルの追加
・HitokotoモデルにUserモデルへの関連を示すIDを追加 - Modelのテスト実装
・フィクスチャの準備
・以下のテストコードを実装
・Userインスタンスから関連するHitokotoインスタンスを取得
・Hitokotoインスタンスから関連するUserインスタンスを取得
・テスト用DBの準備 - ユニットテスト実行(失敗することを確認)
- 本番コード実装
・2で作成したテストコードが正常に実行できるように実装 - ユニットテスト実行(成功する事を確認)
それぞれの手順について確認していきましょう。
●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は、
でなければなりません。ここでは、データベースの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を、以下のとおりに編集してください。
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のユーザーとして「富田」を設定しました。
tomita: id: 1 name: 富田
以上で、このイテレーションで使用するフィクスチャの作成は完了です。
2/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を紹介する。※ショートカットキー、アクセスキーの解説あり
|
|