アソシエーションの利用 (3/5)
作成:2012-11-03 10:07
更新:2012-11-03 10:07
更新:2012-11-03 10:07
■Makerにhas_aを実装する
では、has_aを設定したらMakerインスタンスの中身はどう変わるのか、ビューテンプレートを修正して確認しましょう。「views」内の「makers」内にある「index.html.erb」を開き、その中のメーカーを一覧表示しているテーブルの部分を下のリスト欄にあるように修正してください。修正したら、 http://localhost:3000/makers にアクセスして表示を確認しましょう。各メーカーのところに、そのメーカーの製品情報(製品名とメモ)が1点だけ追加表示されるようになっています。
この情報は、makersテーブルにはありませんgoodsテーブルにあるものです。つまりここでは、makersのテーブルを取り出し、各レコードのメーカーの製品情報を1つだけgoodsから取り出してきて表示する――といったことをRailsがやってくれているわけですね。(実際には、データベースにあるJOINという機能でまとめて取り出しているのですが……)
index.html.erbで、この部分を見てみると、以下のように値を取り出していることがわかります。
アソシエーションでは、このように関連するレコードの情報が、そのモデル名のプロパティに保管されます。has_aは「対応する1つだけ」が関連付けられますから、ここではgoodプロパティに関連するGoodインスタンスが割り当てられていたのです。そのインスタンスから、nameやmemoの値を取り出していたのですね。
ここでは、メーカーと製品というように、必ずしも1対1ではないものから1つだけを取り出していますが、こういう「1対1で対応する」という関係はけっこうあるものです。例えば、今の例の逆から考えると、「商品とメーカー」は1対1の関係ですね(メーカーと商品ではなくて)。本と作者、社員と所属部署などもそうでしょう。こうした1対1で対応するものを扱うのにhas_aは役立ちます。
この情報は、makersテーブルにはありませんgoodsテーブルにあるものです。つまりここでは、makersのテーブルを取り出し、各レコードのメーカーの製品情報を1つだけgoodsから取り出してきて表示する――といったことをRailsがやってくれているわけですね。(実際には、データベースにあるJOINという機能でまとめて取り出しているのですが……)
index.html.erbで、この部分を見てみると、以下のように値を取り出していることがわかります。
<td><% if maker.good != nil %>if maker.good != nil で、makerのgoodというプロパティがカラかどうかをチェックしています。そしてカラでなければ、maker.good.nameと、maker.good.memoの値を書き出しています。これらからだいたい想像がつくとおり、このmaker.goodには、関連するGoodインスタンスが保管されているのです。
<b><%= maker.good.name %></b><br>
<%= maker.good.memo %>
<% end %></td>
アソシエーションでは、このように関連するレコードの情報が、そのモデル名のプロパティに保管されます。has_aは「対応する1つだけ」が関連付けられますから、ここではgoodプロパティに関連するGoodインスタンスが割り当てられていたのです。そのインスタンスから、nameやmemoの値を取り出していたのですね。
ここでは、メーカーと製品というように、必ずしも1対1ではないものから1つだけを取り出していますが、こういう「1対1で対応する」という関係はけっこうあるものです。例えば、今の例の逆から考えると、「商品とメーカー」は1対1の関係ですね(メーカーと商品ではなくて)。本と作者、社員と所属部署などもそうでしょう。こうした1対1で対応するものを扱うのにhas_aは役立ちます。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※views/makers/index.html.erbのテーブル部分の修正 <table> <tr> <th>Name</th> <th>Site</th> <th>Memo</th> <th>Goods</th> <th></th> <th></th> <th></th> </tr> <% @makers.each do |maker| %> <tr> <td><%= maker.name %></td> <td><%= maker.site %></td> <td><%= maker.memo %></td> <td><% if maker.good != nil %> <b><%= maker.good.name %></b><br> <%= maker.good.memo %> <% end %></td> <td><%= link_to 'Show', maker %></td> <td><%= link_to 'Edit', edit_maker_path(maker) %></td> <td><%= link_to 'Destroy', maker, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %> </table>
※関連コンテンツ