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は書くコードの量がハンパなく少ない。メインのテーブルではなく、カテゴリテーブルみたいに更新頻度の低いサブ的なテーブルの管理用アプリケーションが一瞬で作成できるというのは、とても楽だ。