小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Ruby on Rails2.2で別テーブルのデータをセレクトボックスで表示する

Ruby on Rails2.2で別テーブルのデータをセレクトボックスで表示するということをやってみた。
前回のエントリ、Ruby On Rails2.2で検索機能を作ってみる(ON さくらインターネット) - 大人になったら肺呼吸では、検索機能までを作った。今日は、セレクトボックスを使って、ブックマークの入力、そしてその入力値から異なるテーブルの値を取得し、表示するところまでを作ってみる。

完成イメージ

登録画面にカテゴリのセレクトボックスを表示する。

一覧画面

セレクトボックスで選択したカテゴリの名前を別のテーブルから取得し、表示する。

モデルの再構築とデータベースの作成

bookmarksテーブルは、nameとurlの2つしか項目を持っていなかったが、今回は新たにbookmark_category_idという項目を追加する。このため、一度モデルをクリアしてから再度生成しなおす。
1. bookmarkモデルを一度削除する。

script/destroy model Bookmark

2. モデルを再生成する。3つめの項目にbookmark_category_idを指定している。この項目には、別途作成するBookmarkCategoryテーブルのidを格納する。

script/generate model bookmark name:string url:string bookmark_category_id:integer
rake db:migrate

3. カテゴリを管理するBookmarkCategoryモデルをscaffoldで自動生成する。BookmarkCategoryは、カテゴリの名前だけを持たせるようにする。

script/generate scaffold BookmarkCategory name:string
rake db:migrate

画面の変更

登録画面にセレクトボックスを追加する

/app/views/new.html.erbに、以下のコードを追加する。これにより、新規登録画面を表示した際に、カテゴリのセレクトボックスが表示される。

    カテゴリ<br />
    <%= f.collection_select(:bookmark_category_id, BookmarkCategory.find(:all, :order => 'id'), :id, :name) %>
一覧画面にカテゴリ名を追加する

/app/views/index.html.erbに以下の行を追加する。これにより、入力されたカテゴリIDからカテゴリの名前を検索して表示するようになる。

<td><%=h bookmark.bookmark_category.name %></td>

モデルにテーブル間の関連を定義する

app/models/bookmark.rb

ブックマークは1つのカテゴリを持つ。bookmark_categoryモデルに従属しているため、belongs_toを指定する。

class Bookmark < ActiveRecord::Base
  belongs_to :bookmark_category
end
app/models/bookmark_category.rb

反対に、カテゴリは複数のブックマークを持つため、以下のようにhas_manyを指定する。

class BookmarkCategory < ActiveRecord::Base
  has_many :bookmarks
end

上記の手順で完成である。
Ruby on Railsは書くコードの量がハンパなく少ない。メインのテーブルではなく、カテゴリテーブルみたいに更新頻度の低いサブ的なテーブルの管理用アプリケーションが一瞬で作成できるというのは、とても楽だ。