アソシエーションの利用 (1/5)
作成:2012-11-03 10:02
更新:2013-03-17 09:26
更新:2013-03-17 09:26
■アソシエーション利用の準備
データベースを利用するWebアプリケーションというのは、大抵の場合、「1つのテーブルだけ」ということはありません。いくつものテーブルを作成し、必要に応じてそれらから情報を取り出していくものです。こうしたときに重要になるのが、モデルとモデルの関連付けです。
例えば、Railsで買い物リストのモデルを作ったとしましょう。まず、商品データを管理するモデルを用意し、メーカーのモデルを作り、販売店のお店を作る。これらが必要に応じて有機的につなげることができれば、ずいぶんと便利なものになりますね。例えば商品を検索したら、その商品のメーカーの情報がメーカーのテーブルから自動的に取り出される、とか。そのお店を扱うショップの情報がずらっと現れる、とか。そんな具合に、商品・メーカー・お店の3つのテーブルがうまく結びついて機能すればとても便利です。
これを行うためにRailsに用意されているのが「アソシエーション」です。――アソシエーションは、モデルどうしの関連付けを行うための機能です。これにより、あるモデルのレコードから、関連付けられた別のモデルのレコードの情報を取り出すことが可能になります。
どうやってモデルとモデルを関連付けることができるのか? その秘密は、「外部キー」と呼ばれるコラムにあります。アソシエーションを利用する場合、用意されるテーブルの中に、関連付けたいテーブルのレコードのID番号を用意するのです。これが「外部キー」です。Railsは、この外部キーを使って関連するレコードを取り出します。
・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生成のコマンド
・goods生成のコマンド
scaffold作成後、「rake db:migrate」を実行してテーブルを更新しておいてください。これで、 http://localhost:3000/makers や http://localhost:3000/goods にアクセスすれば、メーカーや商品の情報を追加できるようになります。ダミーとして幾つかレコードを作成しておくとよいでしょう。
例えば、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 にアクセスすれば、メーカーや商品の情報を追加できるようになります。ダミーとして幾つかレコードを作成しておくとよいでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
※関連コンテンツ