データベースを利用するWebアプリケーションというのは、大抵の場合、「1つのテーブルだけ」ということはありません。いくつものテーブルを作成し、必要に応じてそれらから情報を取り出していくものです。こうしたときに重要になるのが、モデルとモデルの関連付けです。
例えば、Railsで買い物リストのモデルを作ったとしましょう。まず、商品データを管理するモデルを用意し、メーカーのモデルを作り、販売店のお店を作る。これらが必要に応じて有機的につなげることができれば、ずいぶんと便利なものになりますね。例えば商品を検索したら、その商品のメーカーの情報がメーカーのテーブルから自動的に取り出される、とか。そのお店を扱うショップの情報がずらっと現れる、とか。そんな具合に、商品・メーカー・お店の3つのテーブルがうまく結びついて機能すればとても便利です。
これを行うためにRailsに用意されているのが「
アソシエーション」です。――
アソシエーションは、モデルどうしの関連付けを行うための機能です。これにより、あるモデルのレコードから、関連付けられた別のモデルのレコードの情報を取り出すことが可能になります。
どうやってモデルとモデルを関連付けることができるのか? その秘密は、「
外部キー」と呼ばれるコラムにあります。アソシエーションを利用する場合、用意されるテーブルの中に、関連付けたいテーブルのレコードのID番号を用意するのです。これが「
外部キー」です。Railsは、この外部キーを使って関連するレコードを取り出します。
■サンプルを用意しよう
では、実際にサンプルを動かしながら、このアソシエーションについて試してみることにしましょう。ここでは、2つのモデルを用意することにします。メーカーのモデルと、商品のモデルです。それぞれの内容は以下のようになります。
・makersテーブルname:メーカー名。テキスト値
site:メーカーのWebサイトのURL。テキスト値
memo:メモ書き。テキスト値
・goodsテーブルname:商品名。テキスト値
maker_id:関連するmakersのレコードのID番号(外部キー)。整数値
price:価格。整数値
star:評価を示すもの。整数値
memo:メモ書き。テキスト値
ここでは、
goodsテーブルに「
maker_id」というコラムが用意されています。これが「
外部キー」の項目です。外部キーは、このように「
モデル名_id」というように関連付けるモデル名の後に「_id」をつけた名前になります。この外部キーに、そのレコードに関連する
makersのレコードのID番号を保管しておけば、それをもとにレコードを探し出すことができますね。
では、
scaffoldを使って、2つのモデルを自動生成しておきましょう。コマンドプロンプトから以下のように実行してください。
・makers生成のコマンドrails generate scaffold makers name:string site:string memo:text
・goods生成のコマンドrails generate scaffold goods name:string maker_id:integer
price:integer star:integer memo:text
scaffold作成後、「
rake db:migrate」を実行してテーブルを更新しておいてください。これで、
http://localhost:3000/makers や
http://localhost:3000/goods にアクセスすれば、メーカーや商品の情報を追加できるようになります。ダミーとして幾つかレコードを作成しておくとよいでしょう。